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

- 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: trueand a/scimotionbase path.NEXT_PUBLIC_BASE_PATH=''switches the base path off for a future custom domain. Several routes are markedforce-static. - Articles are MDX with YAML frontmatter (title, subtitle, topic, tags, quiz, read time), read with
gray-matterand rendered withnext-mdx-remote,remark-mathandrehype-katex, so equations render without client JS. lib/topics.tsholds the fields asRecord<Topic, …>maps and never importsfs.lib/articles.tsreads 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.tsdefines 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. AnArticleAnimationsregistry maps names to components for MDX. - Widgets are drawn with canvas, SVG and
requestAnimationFrameloops. 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 --noEmitand 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
Hiring, or building something similar?
I'm open to full-time roles and select freelance work.