Independent Developer & Strategic Trader

Building Systems.
Analyzing Markets.

I am Irvan Farael (Farel Hanafi), an Independent Developer and Strategic Trader. Specializing in building high-performance systems and analyzing markets through technical data. The creator of ValuLens, focusing on 100/100 PageSpeed optimization and data-driven insights.

Irvan Farael Hanafi

Independent Developer & Strategic Trader building high-performance systems.

I am Irvan Farael Hanafi (Farel), an 18-year-old independent professional who chose the self-taught path over formal conventions. Since 2021, I have mastered the art of building robust systems and high-performance web applications, consistently achieving 100/100 PageSpeed scores through rigorous technical optimization.

Beyond the code, I am deeply integrated into the financial markets. I leverage technical analysis—specializing in EMA, VWAP, and RSI—to navigate the IDX and Crypto markets. This dual expertise led to the creation of ValuLens, a platform designed to bridge the gap between complex market data and actionable insights.

My philosophy is simple: "Efficiency is non-negotiable." Whether it's architecting a scalable backend or executing a trade, I prioritize logic, speed, and data-driven results.

2021
The Deep Dive
Started self-taught journey in software development and technical documentation.
2023
Backend & Automation
Began architecting reliable backend systems and automation engines for various scale projects.
2025
Market Integration
Developed professional-grade financial tools and consolidated expertise in technical market analysis.
2026
Present ✦
Independent Dev & Trader.

Technology & Technical Writing Stack

📝 Technical Writing
MarkdownHTML DocsAPI DocumentationQuick Start GuidesGit
⚙️ Backend
Node.jsPythonJavaExpressFastAPIREST API
🗄️ Database
PostgreSQLMySQLMongoDBRedis
🐳 DevOps
DockerLinuxNginxCI/CD
📊 Stock & Finance
Fundamental AnalysisDCFPER/PBVValuation Models
🎨 Frontend
ReactTypeScriptViteNext.js

Selected Projects

01

ValuLens — Stock Fundamental Analysis

Managing real-time WebSocket streams for multiple tickers caused significant main-thread blocking and UI jank. Standard React state updates couldn't keep up with high-frequency crypto price movements, leading to memory leaks and degraded performance on lower-end devices.

Offloaded heavy data processing to Web Workers to keep the UI responsive. Implemented a custom throttling layer for state updates and utilized a normalized data structure to ensure O(1) lookup times for technical indicators like VWAP and RSI across different timeframes.

Used Next.js with deep optimization for Core Web Vitals to maintain a 100/100 PageSpeed score. Chose a modular architecture for the analysis engine so technical indicators can be calculated independently, avoiding unnecessary re-computations when only one data point changes.

Zero UI lag even during high market volatility. Achieved perfect Lighthouse scores for SEO and performance, while reducing client-side CPU usage by 40% compared to the initial monolithic implementation.

TypeScriptReactVite
src/lib/calculations.ts
export interface CalculationResult {
  per: number | null; // null represents N/A
  pbv: number | null;
  grahamNumber: number | null;
  dividendYield: number;
  epsCagr: number | null;
  epsGrowthTrend: Trend;
  epsGrowthArray: number[];
  dcfValue: number | null;
  peBandValue: number | null;
  fairValue: number | null;
  marginOfSafety: number | null;
  status: "Speculative" | "Undervalued" | "Fair Value" | "Overvalued";
  financialScore: number;
  checklist: {
    roeHigh: boolean;
    derLow: boolean;
    epsPositive: boolean;
    growthPositive: boolean;
    pbvLow: boolean;
    perLow: boolean;
  };
}
02

Masha WhatsApp Baileys Bot

GitHub

Scaling a Baileys-based bot to handle high-traffic group chats caused frequent authentication crashes and memory spikes. The session state often became desynchronized during rapid multi-message events, leading to duplicate responses and unstable connections.

Implemented a robust session management system using a persistent file-based store with an atomic write mechanism to prevent state corruption. I utilized a prioritized message queue to handle incoming events asynchronously, ensuring the bot remains responsive even under heavy load.

Chose a modular command-handler pattern over a single massive switch-case to enable independent feature updates and easier debugging. I prioritized low-resource consumption by optimizing media handling and implementing an automated backup for session credentials.

Achieved 99.9% uptime with stable long-term authentication sessions. The bot can now process hundreds of concurrent messages without memory leaks, significantly reducing manual intervention for re-pairing or server restarts.

JavaScriptPythonBaileys
main.js
const connectionOptions = {
    version,
    keepAliveIntervalMs: 30000,
    printQRInTerminal: !usePairingCode,
    logger: pino({ level: "silent" }),
    auth: state,
    browser: ["Mac OS", "Safari", "10.15.7"],
    //browser: Browsers.ubuntu('My App'),//
    getMessage: async (key) => {
      if (store) {
        const msg = await store.loadMessage(key.remoteJid, key.id, undefined);
        return msg?.message || undefined;
      }
      return {
        conversation: "Kaede",
      };
    },
  };
03

Lumen — Digital Spiritual Space

GitHub

Standard full-stack frameworks introduced too much overhead for high-frequency automation tasks, leading to unnecessary latency and high CPU usage. Building a lightweight engine that could handle rapid data processing without sacrificing stability was the primary challenge.

Developed a micro-focused engine using a minimalist architectural approach. I implemented a streamlined execution pipeline that prioritizes raw performance, ensuring that core logic execution remains decoupled from heavy dependencies to minimize memory footprint.

I opted for a "performance-first" philosophy, stripping away unnecessary abstractions that usually slow down automated systems. This allowed for better control over resource allocation and faster response times, which is critical when dealing with real-time automation and data integrity.

Reduced system latency by over 50% compared to traditional implementations. The lightweight nature of Lumen enabled it to run efficiently on low-spec environments while maintaining the capability to handle intensive automated workflows with zero downtime.

TypeScriptNext.jsReactVite
artifacts/prayer-app/src/App.tsx
function ClerkQueryClientCacheInvalidator() {
  const { addListener } = useClerk();
  const queryClient = useQueryClient();
  const prevUserIdRef = useRef<string | null | undefined>(undefined);

  useEffect(() => {
    const unsubscribe = addListener(({ user }) => {
      const userId = user?.id ?? null;
      if (
        prevUserIdRef.current !== undefined &&
        prevUserIdRef.current !== userId
      ) {
        queryClient.clear();
      }
      prevUserIdRef.current = userId;
    });
    return unsubscribe;
  }, [addListener, queryClient]);

  return null;
}
04

SaveFlow Media Downloader

Most media downloaders are cluttered with intrusive ads, slow bundling times, and poor mobile responsiveness. Handling large binary data streams in the browser often led to UI freezes and failed downloads due to inefficient memory management during the blob conversion process.

Built a modern, ad-free downloader using React and Vite for near-instant HMR and optimized build fragments. I implemented a stream-based download architecture using the Fetch API and Blobs, ensuring that media files are processed efficiently without locking the browser's main thread.

Chose Vite over Create React App to significantly reduce cold-start times and leverage native ES modules. I prioritized a "Mobile-First" UI approach with zero external CSS bloat, ensuring the app stays lightweight and achieves maximum performance scores on Google PageSpeed Insights.

Achieved a 100/100 performance score on mobile and desktop devices. The application provides a seamless, high-speed downloading experience with a 60% faster initial load time compared to traditional media tools, handling multiple concurrent downloads with zero UI lag.

TypeScriptReactVite
src/App.tsx
function Router() {
  return (
    <>
      <Navbar />
      <Switch>
        <Route key="home" path="/" component={Home} />
        <Route key="tiktok" path="/dl/tiktok" component={TiktokPage} />
        <Route key="instagram" path="/dl/instagram" component={InstagramPage} />
        <Route key="facebook" path="/dl/facebook" component={FacebookPage} />
        <Route key="twitter" path="/dl/twitter" component={TwitterPage} />
        <Route key="youtube" path="/dl/youtube" component={YoutubePage} />
        <Route key="notfound" component={NotFound} />
      </Switch>
      <Footer />
    </>
  );
}

How I Structure Backend Systems

Folder Structure

backend-api/
├── controllers/    # HTTP layer
├── services/       # Business logic
├── repositories/   # Data access
├── models/         # DB schemas
├── routes/         # Route definitions
├── middlewares/    # Auth, validation
└── server.js

Example API Endpoint

// controllers/userController.js
const getUser = async (req, res, next) => {
  try {
    const user = await userService.findById(req.params.id);
    if (!user) return res.status(404).json({ error: "User not found" });
    res.json({ data: user });
  } catch (err) { next(err); }
};

Database Schema

-- Optimized with indexes
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email VARCHAR(255) UNIQUE NOT NULL,
  name VARCHAR(100) NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_users_email ON users(email);
Irvan Farael Hanafi

Irvan Farael Hanafi

Backend Developer · Technical Writer · Open to opportunities

Let's build something robust together.

Interested in backend, technical documentation, or stock analysis? I'm here to help.

Email

farellh12@gmail.com

Location

Ponorogo, Indonesia · Remote Available