Every local-discovery app on earth uses a map pin. Ours is the only one with a second waypoint — because a single point is a location, and Prefway has never been about where you are. It's about where you're going next.
The pin is you. It holds the ground. It never moves, never recolors, never animates. On dark surfaces it turns cream; that is its only permitted change.
The needle is the brand. Signal Vermilion — our most ownable color, on our hero element. Concentric with the pin to the pixel, so it rotates like a bearing on a jewelled pivot. It is the only element that ever moves.
The next waypoint is the promise. Way Violet — the color of what hasn't happened yet. It sits apart from the pin because the next stop is always somewhere you aren't.
Gold is earned. It exists in the system but not in the resting mark. It appears exactly twice in the life of an adventure: the moment you arrive, and the moment you finish.
The needle rests at −14.8° and the next waypoint at −7° — each angled toward the other. At rest, the mark isn't a needle pointing at an inert dot; it's two waypoints acknowledging each other. The relationship is legible before anything moves. These two angles are canonical: every animation settles back to them, every static asset is frozen at them.
Each color has exactly one role. The moment a color does two jobs, it stops meaning either.
It lives on the needle, in the city code, on the CTA. It is constant — it never changes with product state, because it's who we are, not what's happening.
It lives on the next waypoint — the element that charges, glows, and gets replaced by gold. Violet is the color of not yet. When something happens, it happens to the violet element.
Arrival and completion. Nothing else. If gold appears on a splash screen, a header, or a decoration, it has been spent and arrival means nothing.
Ink fills; Midnight edges and grounds. They are one dark voice with two hex values — never use them to signal anything.
A dark pin on a dark ground has no silhouette — the container vanishes and the mark falls apart. The reverse is simple and absolute: the pin becomes cream, both hero colors stay exactly where they are.
The wordmark is drawn, not typed — a custom logotype built from Gamble by Type Department, outlined and owned outright. Around it, two working faces and one accent, each with a job it never trades.
Festival of Nations — 3 stops remaining
You're 240m from Ledger & Co. Check in when you arrive to earn the South Grand badge. This paragraph is Söhne Book at text size — the voice of every screen, every report, every merchant dashboard, every district proposal.
Custom (Gamble-based)
outlined vector, never typed
Walsheim Black/Bold
campaign, city codes, decks
Söhne Book/Medium
app, docs, dashboards
Pythia
adventure names, badges only
Nothing in this system is keyframed. The needle is a magnetised instrument — mass, damping, and a field that pulls toward the next stop. The waypoint carries lume: it glows brighter as you get closer, like a watch dial charging. Together they mean the mark doesn't decorate the product — it reports on it.
Real dipole physics: τ = −μB·sin(Δθ). Field strength scales with proximity. Far away, the needle trembles — uncertainty, made visible. Close in, it goes rigid. Seek, lock, overshoot and settle are all consequences of one equation, not animations.
A violet glow that charges as you approach — dim at distance, burning when you're close. On check-in it flares gold and, on the final stop, stays gold. Light radiates from inside the shape. It never slides across it; instruments glow, they don't shine.
The needle drifts. Nothing glows. It isn't pretending to search — it genuinely can't find anything yet.
Holds the bearing but hunts around it. The violet is barely lit. Uncertainty, made visible.
The tremble is gone; the violet glows hot. You can feel and see you're nearly there — no number needed.
The waypoint goes gold and holds. No flare, no fireworks on the mark — the screen does the celebrating.
Motion systems die by a thousand small exceptions. These aren't guidelines — they're the constitution. Anyone touching the mark signs up to all six.
The pin holds. The waypoint holds its position. If a second element is translating or rotating independently, someone has made a mistake.
The logo's needle always resolves to its own waypoint (−14.8°). It never chases a real-world bearing — a fixed dot plus a free needle is a logo that looks broken. Live heading belongs to a separate, dot-less compass component inside the app.
Arrival and completion. It is never on the splash, never on the resting mark, never decorative. Scarcity is the entire mechanism.
App icons, favicons, print, clings, decks: needle at −14.8°, waypoint at −7°, no lume, no motion, no exceptions. Both platforms ship static icons; design for that truth.
The needle moves only when something is happening — GPS acquiring, a bearing updating, a check-in landing. A needle sweeping for decoration is a compass that lies. Splash gets one sweep (≤900ms), then rest. Respect prefers-reduced-motion.
The mark is embedded whole from the source SVG — root styles, strokes, joins, fill rules and all. Anyone re-typing a path string is introducing next quarter's rendering bug. The animation layer may touch exactly three things: the needle group's rotation, the waypoint's fill, and the glow.
Switch the city. What changes: the code, the subdomain, the content. What doesn't: the mark, the motion, the palette, the binary. A visitor who has Prefway from any city opens it in yours and you're in their pocket on arrival — that's the sentence a DMO director buys. City is runtime config, not a build target.
Energizer Park, the Brickline, Festival of Nations, Zoofari. First deployment — the model gets proved here.
Everything a developer needs, measured from the master file — not eyeballed.
// ---------- geometry (from prefway_logo_.svg, verified) ---------- pivot = (527.8, 378.7) // pin centre — the needle's rotation origin needle rest = −14.8° // baked into the master; every animation settles here waypoint rest= −7.0° // the mutual tilt; the dot's orientation never changes // ---------- layer 1: behaviour ---------- B = !hasFix ? 0 : clamp(1 − dist/FAR, 0.10, 1) ** 1.4 // field ∝ proximity ω += ( −K·B·sin(θ − bearing) − C·ω + noise·J·(1.05 − B) )·dt θ += ω·dt // seek, lock, overshoot, settle, tremble — all from this line // ---------- layer 2: light ---------- lume += (B − lume)·6·dt // charges and decays smoothly, never snaps glow.opacity = lume × 0.55 // violet bloom radiates from inside the dot if (checkedIn) waypoint.fill = GOLD // that's all — the screen celebrates, not the mark if (completed) waypoint stays gold, needle rests, nothing moves again // ---------- what the animation layer may touch ---------- // 1. rotate(needleGroup) 2. waypoint fill 3. glow opacity. Nothing else. Ever.