Skip to content
AFM Studio
  • Pages

    AFM Studio
  • Work
  • Lab
  • About
  • CV
  • Contact
  • Projects

    AksaraA searchable library for Otorita IKN's knowledge, where the server checks every reader's access across three levels
  • Daily TaqwaTamper-resistant prayer attendance system for ~2,000 OIKN government employees at Masjid Negara IKN
  • Lantara v2A permit engine for Otorita IKN where administrators add new permit types from a screen, without a developer
  • eKiosk IKNTwo control rooms for Nusantara: kiosk content management and live bus tracking with arrival times that grade themselves
  • E-Monev IKNA monitoring platform for Nusantara's 23-year build, tracking every unit's quarterly progress against 24 national KPIs
  • JDIH OIKNOIKN's public legal document portal, with a controlled publishing workflow and AI summaries that never leave the server
  • Jejak PenanamanA check-in app for IKN tree-planting events that proves each participant was on site with a geofenced selfie
  • Dashboard SAKTIA nightly pipeline and dashboard that replaces OIKN's manual budget downloads for all six of its budget units
  • DoseRxA bedside dose calculator for 127 drugs that rounds each dose to tablets and syrups Indonesian pharmacies sell
  • CubiqA speedcubing trainer with competition-grade timing and a solver I wrote for each of the 8 major puzzles
  • ScimotionAn interactive science library of 86 articles, each explained next to animations the reader can control
  • WA Daily Scrum BotA WhatsApp bot that chases missing standup reports for a 14-person team and flags tasks stuck for days

↑ ↓ to move · Enter to open · Esc to close

Scimotion

An interactive science library of 86 articles, each explained next to animations the reader can control

Screenshots
illustrated articles, each with a quiz
86
hand-coded interactive animations
172
fields, from mathematics to medicine
8
curated learning paths
9
On this page

The problem

Science writing puts equations and diagrams flat on the page, but the ideas behind them move. A reader can memorise the Fourier transform formula and never see why breaking a signal into waves works. Most science media sits at one of two ends. Pop-science videos stay shallow, and academic papers go deep with no visuals.

Scimotion is for curious non-specialists: students, self-learners and professionals from nearby fields. They want the whole idea, and they want to change the inputs and watch what happens.

What I built

Every article pairs text with an animation you control

Each article explains one idea in prose and equations, next to animations the reader can play, pause, reset and adjust. There are simulations of Brownian motion, a pendulum and the double-slit experiment. There are step-through views of binary search and Euler's formula, and data views of the Central Limit Theorem and the Hubble diagram. Each animation starts when it scrolls into view, so nothing runs off-screen. Most articles have a main widget plus a smaller one that answers the question the first one raises.

I wrote the science animations by hand

All the simulation and drawing code is my own. I use an animation library only for page details, like card entrances and the dot-grid on the homepage. That keeps the page size predictable. It also means a physics simulation behaves the same way every time, because no library is scheduling its frames.

Nine learning paths turn the articles into a syllabus

I grouped the articles into nine ordered reading paths, such as Calculus & Transforms and Planet Earth. Each article belongs to exactly one path, so "previous" and "next" always mean one thing. The order has reasons behind it. Kinetics comes before acids and bases, because the acid constant is an equilibrium constant that needs the kinetics groundwork first.

Adding a field can't leave the site half-updated

The library grew from four fields to eight. I split Biology out of Medicine and added Chemistry, Earth & Climate, and Astronomy & Cosmology. Each field has a colour, a description and pages that must stay in sync. I keep them all in one typed list, so the build fails until a new field is fully described everywhere.

I moved hosting to a static site on GitHub Pages

Partway through, I moved the site from Vercel to a static export on GitHub Pages. That meant serving it from a sub-path and marking several routes as fully static. Every publish now runs a type check and lint first, so a mistake stops before it goes live.

Result

Scimotion is live and free to read. It started as a five-article proof of concept. It now has 86 articles across 8 fields, from mathematics to medicine, with 172 hand-coded animations. Every article has a multiple-choice quiz, key takeaways and its own table of contents. Readers can browse by field, tag or learning path, search the full text, or follow the RSS feed. Midway through, I replaced a cold navy theme with a warmer one, because the first felt sterile for science. That change touched every shared component. I built it over about five weeks in June and July 2026, with most of the work on nine days.

Under the hoodTechnical detail for engineers
  • Next.js 16 App Router with output: 'export', trailingSlash: true and a /scimotion base path. NEXT_PUBLIC_BASE_PATH='' switches the base path off for a future custom domain. Several routes are marked force-static.
  • Articles are MDX with YAML frontmatter (title, subtitle, topic, tags, quiz, read time), read with gray-matter and rendered with next-mdx-remote, remark-math and rehype-katex, so equations render without client JS.
  • lib/topics.ts holds the fields as Record<Topic, …> maps and never imports fs. lib/articles.ts reads the content directory and is never imported by a client component, so Node built-ins stay out of the browser bundle. The boundary is documented in the file.
  • lib/paths.ts defines the 9 learning paths.
  • Each widget is a self-contained client component in components/animations/ with its own play, pause and reset state and no shared global state. A shared Intersection Observer hook starts it. An ArticleAnimations registry maps names to components for MDX.
  • Widgets are drawn with canvas, SVG and requestAnimationFrame loops. Framer Motion covers UI chrome only.
  • Pages are server components by default. Only the widgets, progress bar, table of contents, theme toggle, search, quiz and motion wrappers are client components.
  • Theming uses CSS variables and next-themes, dark by default. Sitemap, canonical and OG tags, and a branded 404.
  • GitHub Actions runs tsc --noEmit and lint before each deploy.
  • Articles per field: Mathematics 15, Physics 12, Chemistry 11, Computer Science 11, Earth & Climate 10, Biology 10, Medicine 9, Astronomy & Cosmology 8.
  • About 72,700 lines of TS, TSX and MDX, 146 commits from 18 June to 23 July 2026.

Screenshots

Explore
Post Detail
Post Animation
Learning Path
Learning Path Detail
Field

Hiring, or building something similar?

I'm open to full-time roles and select freelance work.