Chemigo app icon

Chemigo

iOS · General and organic chemistry

Every atom has a face, and the face is computed.

An iOS app for general and organic chemistry, written in SwiftUI. A character's expression is derived from its valence shell rather than picked from a set of animations: unpaired electrons read as anxious, a filled octet reads as calm. Bonding two atoms changes both faces, because it changes both shells. The octet rule is running as the rendering rule.

Try the bonding lab Build a molecule
Try it · the mechanism

The face is a pure function of the shell.

This is the app's own model, ported to the browser: the same element table, the same octet arithmetic, and the same face rig with the same per-mood keyframes. Pick an element, then add bonds. Nothing here is decorative — every eyebrow angle is downstream of one integer, the number of electrons still unpaired.

The rule, verbatim from AtomMood.swift: 0 unshared is blissful, 1 is happy with lone pairs to lean on and merely curious without, 2 uneasy, 3 worried, 4 overwhelmed.

Try it · guided build

Only the legal move is lit.

Build mode can't be put into an invalid state: the next valid atom is the one that's glowing. Multiple bonds aren't free; they're raised by tapping the rail, so O₂, N₂ and CO₂ each take an extra step. Every recipe below is the real one, with the same angles, lone pairs and text the app ships.

Blueprint

Screens

The app on device.

Captured from a build running on an iPhone simulator. Every expression here comes from the native MoodFace rig. No canned expression loop, no imported animation files.

Home: the HUD, today's lesson, and the four course tracks.
The valence-shell explorer, with carbon four bonds short of calm.
Ammonia completes as 🔺 The Pyramid of Giza, lone pair on top.
Dark mode, resolved properly: water as 🪃 The Boomerang.
Units open with a professor, then lessons wind down the screen.
What's in it

Four tracks, a lab, and spaced repetition.

Learn

Gen Chem 1/2, OChem 1/2

51 lessons across 16 units, from a first covalent bond to aromaticity, enolates, curved arrows, nucleophiles and radical chains, written in the vocabulary the course actually uses. Each unit is introduced by an element professor.

Lesson shape

Overview → concepts → questions

Hearts and a progress bar pin to the top; the verdict lands in a full-width banner at the bottom, within thumb reach, carrying the explanation and the one button that moves you on.

Notation

Four ways to draw it

The Blueprint panel shows anything built as molecular formula, Lewis dots, structural lines and skeletal shorthand: the four notations a course asks for.

Notebook

Molar mass, dilution, yield

Parenthesis-aware molar mass, dilution and percent-yield calculators sitting next to persistent notes, so the bench work and the lesson aren't in two different apps.

Recall

Leitner-box spaced repetition

18 organic chemistry cards that resurface on a schedule set by how well they were answered, plus XP, hearts and a daily streak. The session length it's designed around is a few minutes.

Data handling

No analytics, no ads, no SDKs

Progress lives on device and in the user's own private CloudKit database, which I can't read, with an automatic local-only fallback when iCloud isn't available. The App Store privacy answer is "we don't collect data."

Inside

One source of truth, three surfaces reading from it.

AtomKit owns the chemistry. An Atom knows its element, bonds, unshared electrons, lone pairs and current mood; the character rig, the guided builder and the lesson engine are all different views onto that one model. It's why the face can't drift out of sync with the chemistry. There is nowhere else for the expression to come from.

AppHome · Learn · Lab · You
AtomKitElements, bonds, lone pairs, mood. The single source of truth.
DesignSystemTokens generated from Figma into Swift.
ProgressKitSwiftData: XP, streak, hearts, spaced repetition.
CharacterKitThe native MoodFace rig and avatar gear.
LessonKitLesson content and scoring.
FlashcardKitDeck content and Leitner boxes.
LanguageSwift 6, strict concurrency
UISwiftUI on iOS 26, @Observable via the Observation framework
PersistenceSwiftData with CloudKit private database; automatic local-only fallback
CharactersNative MoodFace rig (animated arcs, not sprite sheets)
Design tokensFigma → chemigo.tokens.json → generated ChemigoTokens.swift, re-run as a build pre-action
ProjectXcodeGen from project.yml; the .xcodeproj isn't tracked
Bundleedu.ucsd.chemigo.Chemigo
Design system

Three rules explain almost every screen.

This page is drawn with the app's actual tokens, so what you're reading is a specimen rather than a description. The buttons below press; the cards don't.

Surfaces

Flat cards, not floating ones

A surface is a fill plus a crisp 2pt border. Blur shadows are gone everywhere. The only thing with depth is something you can press.

Affordance

Depth means tappable

Buttons, lesson nodes and answer options sit on a solid darker rim that they press down into. There are four button kinds: solid, outline, soft and disabled. There is no fifth.

Color

One green accent

Green carries the product. Blue, violet and coral mark a kind of activity, never a second brand. Element colors are fixed literals in both schemes, because the atoms are self-lit artwork and shouldn't shift between light and dark.

Honestly

What it doesn't do.