{
  "profile": {
    "name": "Fariz Wibisono",
    "title": "Full-Stack Software Engineer",
    "summary": "Full-stack software engineer working with TypeScript, React, Next.js, Node.js and PostgreSQL. I build and modernize production web platforms: interfaces, APIs, data pipelines, and the tests and infrastructure around them.",
    "location": "Cirebon, Indonesia",
    "email": "frzwibisono@gmail.com",
    "url": "https://frzxw.me",
    "resume": "https://frzxw.me/cv.pdf",
    "links": [
      {
        "label": "GitHub",
        "href": "https://github.com/frzxw"
      },
      {
        "label": "LinkedIn",
        "href": "https://www.linkedin.com/in/frzxw/"
      },
      {
        "label": "X",
        "href": "https://x.com/frzwibisono"
      }
    ]
  },
  "experience": [
    {
      "id": "enclavium",
      "organization": "Enclavium",
      "role": "Full-Stack Software Engineer",
      "period": "2023 – Present",
      "start": "2023",
      "points": [
        "Led the brownfield modernization of Invictus from an MVP built around Robinhood Chain (Telegram bot and Express-served web app) into a multi-chain, multi-protocol LP terminal on seven chains, serving 1,000+ concurrent users and $4M in transaction volume.",
        "Re-architected it as a TypeScript monorepo (pnpm, Turborepo): Next.js web, Fastify API with oRPC and WebSockets, per-chain indexers, and BullMQ workers on PostgreSQL with TimescaleDB and Redis.",
        "Integrated 31 protocol deployments across 15 variants (Uniswap, PancakeSwap, Aerodrome, Meteora) on EVM chains and Solana, normalized server-side into one position model.",
        "Replaced the MVP's custodial hot wallets with Privy embedded and self-custody wallets so no private keys are stored, and chose TimescaleDB after measuring 30-day event storage at about 22 GB compressed versus 80 GB in plain Postgres."
      ],
      "stack": [
        "TypeScript",
        "Next.js",
        "Node.js",
        "Fastify",
        "PostgreSQL",
        "TimescaleDB",
        "Redis",
        "BullMQ",
        "Docker",
        "MCP"
      ]
    },
    {
      "id": "scada-prima-cipta",
      "organization": "PT SCADA PRIMA CIPTA",
      "role": "Software Engineer Intern",
      "period": "Feb 2026 – Jun 2026",
      "start": "2026-02",
      "end": "2026-06",
      "place": "Bandung, on-site",
      "points": [
        "Re-implemented core modules of PROMIA, a risk-based inspection (RBI) desktop application, as a Next.js web app on SQL Server, working from its screens, workflows and data structures rather than its source code; covered flows with Playwright E2E and Vitest unit tests.",
        "Built scada.co.id as a static Astro site on Sanity CMS (GROQ, six cross-referenced content types), deployed with Docker on a VPS, so non-technical staff publish without code changes.",
        "Automated PDF-to-article drafting with an n8n and LLM (OpenRouter) pipeline into Sanity, with field validation, run logging and human review before publishing."
      ],
      "stack": [
        "Next.js",
        "TypeScript",
        "SQL Server",
        "Playwright",
        "Vitest",
        "Astro",
        "Sanity CMS",
        "n8n",
        "OpenRouter",
        "Docker"
      ]
    },
    {
      "id": "kemakom-upi",
      "organization": "KEMAKOM UPI",
      "role": "Software Engineer (Volunteer)",
      "period": "2024 – 2025",
      "start": "2024",
      "end": "2025",
      "points": [
        "Built the Dinamik 19 event website (competition pages, technical guidelines) and the P2M community tourism website."
      ],
      "stack": [
        "PHP",
        "Laravel",
        "MySQL",
        "JavaScript",
        "Tailwind CSS"
      ]
    },
    {
      "id": "freelance",
      "organization": "Freelance",
      "role": "Full-Stack Software Engineer (Freelance)",
      "period": "2021 – 2023",
      "start": "2021",
      "end": "2023",
      "points": [
        "Delivered websites and web applications for clients and communities end to end: requirements, REST APIs (Laravel, Express.js), React and Next.js frontends, MySQL and MongoDB, deployment and handover."
      ],
      "stack": [
        "JavaScript",
        "TypeScript",
        "PHP",
        "Laravel",
        "React",
        "Next.js",
        "Node.js",
        "Express.js",
        "MySQL",
        "MongoDB",
        "Tailwind CSS",
        "Git"
      ]
    }
  ],
  "education": {
    "school": "Universitas Pendidikan Indonesia",
    "program": "Computer Science, undergraduate",
    "period": "2023 – Present"
  },
  "certifications": [
    {
      "name": "Belajar Dasar AI (AI Fundamentals)",
      "issuer": "Dicoding Indonesia",
      "year": "2024",
      "href": "https://www.dicoding.com/certificates/2VX34O8VNZYQ"
    }
  ],
  "awards": [],
  "skills": [
    {
      "label": "Languages",
      "items": [
        "TypeScript",
        "JavaScript",
        "PHP",
        "Python",
        "Rust",
        "Dart"
      ]
    },
    {
      "label": "Frontend",
      "items": [
        "React",
        "Next.js",
        "Astro",
        "Tailwind CSS",
        "Radix UI",
        "Flutter"
      ]
    },
    {
      "label": "Backend",
      "items": [
        "Node.js",
        "Fastify",
        "Express.js",
        "NestJS",
        "Laravel"
      ]
    },
    {
      "label": "Data and queues",
      "items": [
        "PostgreSQL",
        "TimescaleDB",
        "MySQL",
        "MongoDB",
        "Redis",
        "BullMQ",
        "Supabase"
      ]
    },
    {
      "label": "Testing and automation",
      "items": [
        "Vitest",
        "Playwright",
        "n8n"
      ]
    },
    {
      "label": "DevOps and tooling",
      "items": [
        "Docker",
        "GitHub Actions",
        "Cloudflare",
        "Vercel",
        "Git",
        "GitHub",
        "Biome",
        "Turborepo",
        "Postman"
      ]
    },
    {
      "label": "AI tools",
      "items": [
        "MCP",
        "OpenRouter",
        "Claude Code",
        "Cursor"
      ]
    },
    {
      "label": "CMS",
      "items": [
        "Sanity CMS"
      ]
    }
  ],
  "projects": [
    {
      "id": "invictus",
      "title": "Invictus",
      "summary": "Multi-chain DeFi LP terminal",
      "statement": "People who lend their crypto to trading pools often have money in many places at once. Invictus is the terminal that puts all of it on one screen, live. I led the rebuild that took it from an MVP on Robinhood Chain to seven chains.",
      "role": "Lead engineer: architecture and full-stack build",
      "status": "Live",
      "platform": "Web",
      "result": "1,000+ concurrent users and $4M in transaction volume across seven chains.",
      "stack": [
        "TypeScript",
        "Next.js",
        "Node.js",
        "Fastify",
        "PostgreSQL",
        "TimescaleDB",
        "Redis",
        "BullMQ",
        "Docker",
        "MCP"
      ],
      "links": [
        {
          "label": "lpinvictus.com",
          "href": "https://www.lpinvictus.com/"
        },
        {
          "label": "Documentation",
          "href": "https://docs.lpinvictus.com"
        }
      ],
      "url": "https://frzxw.me/projects/invictus"
    },
    {
      "id": "content-pipeline",
      "title": "PDF to blog pipeline",
      "summary": "AI-assisted workflow that turns PDF documents into blog drafts",
      "statement": "The company's know-how lived in PDF brochures and technical documents. I built an automated assistant that turns each PDF into a first draft of a web article, so a person only has to review and edit it.",
      "role": "Built during my internship at PT SCADA PRIMA CIPTA",
      "status": "Internal tool",
      "platform": "n8n workflow",
      "timeline": "Feb – Jun 2026",
      "result": "Editors start each post from a structured draft instead of a blank page.",
      "stack": [
        "n8n",
        "OpenRouter",
        "Sanity CMS",
        "Astro",
        "Google Drive",
        "Docker"
      ],
      "links": [],
      "url": "https://frzxw.me/projects/content-pipeline"
    },
    {
      "id": "sakola",
      "title": "Sakola",
      "summary": "Modular multi-tenant school platform",
      "statement": "Student savings is other people's money, handled every school day. I'm building Sakola so that every rupiah deposited or withdrawn is recorded once, can be explained later, and adds up at closing time.",
      "role": "Design and build",
      "status": "In progress",
      "platform": "Web",
      "timeline": "Ongoing",
      "result": "Student savings module built on an append-only ledger; more modules in progress.",
      "stack": [
        "TypeScript",
        "Next.js",
        "PostgreSQL",
        "Tailwind CSS"
      ],
      "links": [],
      "url": "https://frzxw.me/projects/sakola"
    },
    {
      "id": "rasain",
      "title": "Rasain",
      "summary": "Recipe and cooking app with a step-by-step cooking mode",
      "statement": "A recipe is only useful while you are cooking it. Our team built a mobile app that walks you through each step with its own timer, and knows what is already in your kitchen.",
      "role": "Team project; project setup, Supabase integration, pantry module",
      "status": "Team project",
      "platform": "Mobile (Flutter)",
      "timeline": "Apr – Jul 2025",
      "result": "A Flutter app on Supabase with recipes, cooking timers, reviews, notifications and pantry management.",
      "stack": [
        "Flutter",
        "Dart",
        "Supabase",
        "PostgreSQL"
      ],
      "links": [
        {
          "label": "Source on GitHub",
          "href": "https://github.com/frzxw/rasain-app"
        }
      ],
      "url": "https://frzxw.me/projects/rasain"
    }
  ],
  "websites": [
    {
      "title": "PT SCADA PRIMA CIPTA",
      "label": "Company website",
      "url": "https://scada.co.id/"
    },
    {
      "title": "Invictus",
      "label": "Product landing page",
      "url": "https://www.lpinvictus.com/"
    },
    {
      "title": "Helmet",
      "label": "Landing page",
      "url": "https://hermes-helmet-landing.vercel.app/"
    },
    {
      "title": "Laksana",
      "label": "Studio website",
      "url": "https://www.laksana.dev/"
    },
    {
      "title": "Runtastic",
      "label": "Landing page",
      "url": "https://runtastic-landing.vercel.app/"
    }
  ],
  "posts": [
    {
      "title": "A portfolio that agents can read",
      "date": "2026-11-12",
      "summary": "More people now meet my work through an AI assistant than through my home page. Here is what this site serves to agents, and why each piece is small.",
      "url": "https://frzxw.me/blog/a-portfolio-for-agents"
    },
    {
      "title": "A shared brain for me and my AI tools",
      "date": "2026-11-12",
      "summary": "My notes live in an Obsidian vault of plain Markdown files that both I and my AI assistants can read and update. How it is organised, and the rules that keep it useful instead of messy.",
      "url": "https://frzxw.me/blog/a-shared-brain-with-obsidian"
    },
    {
      "title": "How I use AI as leverage, not autopilot",
      "date": "2026-11-12",
      "summary": "AI writes a lot of my first drafts now, in code and in content. This is where I draw the line between what the tool does and what stays my job, and the writing that shaped how I think about it.",
      "url": "https://frzxw.me/blog/ai-as-leverage"
    },
    {
      "title": "Context engineering: give the model the right information, not more of it",
      "date": "2026-11-12",
      "summary": "Better prompts only go so far. Most of the quality I get from AI tools comes from what they can see when they start: short rules, the right files, and nothing that distracts them.",
      "url": "https://frzxw.me/blog/context-engineering"
    },
    {
      "title": "Designing for what you can't know",
      "date": "2026-11-12",
      "summary": "Good software is honest about uncertainty. A small example from a crypto terminal: when the data stops, we say so on screen instead of pretending everything is live.",
      "url": "https://frzxw.me/blog/designing-for-what-you-cant-know"
    },
    {
      "title": "Harness engineering: the checks around the model matter more than the model",
      "date": "2026-11-12",
      "summary": "If AI writes more of the code, the engineer's job shifts toward building the guardrails it works inside: tests, types, linters, review and safe limits. Here is the harness I use and why.",
      "url": "https://frzxw.me/blog/harness-engineering"
    },
    {
      "title": "Store the history, not just the number",
      "date": "2026-11-12",
      "summary": "Two very different products, a crypto terminal and a school savings app, ended up with the same rule for money: never edit a number, only add a record. Why that matters, and what it costs.",
      "url": "https://frzxw.me/blog/ledgers-not-balances"
    },
    {
      "title": "Measure before you choose: why I start with boring technology",
      "date": "2026-11-12",
      "summary": "Data-heavy products attract exciting infrastructure. I usually start with the simplest setup that works, and I make that choice with numbers, so it is easy to explain and easy to revisit.",
      "url": "https://frzxw.me/blog/measure-before-you-choose"
    },
    {
      "title": "Rebuild or refactor? How I decide",
      "date": "2026-11-12",
      "summary": "The usual advice is never to rewrite a working product. Sometimes it is still the right call. These are the four questions I ask before choosing, and how they played out on a real product.",
      "url": "https://frzxw.me/blog/rebuild-or-refactor"
    },
    {
      "title": "Why strict languages and AI agents get along",
      "date": "2026-11-12",
      "summary": "AI tools fix mistakes fastest when the mistake is pointed out precisely. That is why strict languages like Rust, and strict TypeScript, make agent-written code easier to trust and debug.",
      "url": "https://frzxw.me/blog/rust-strictness-and-agents"
    }
  ]
}