anishfn / shapeshift
git clone https://github.com/anishfn/shapeshift.git
An input that becomes what you mean: one text box that morphs into the right UI as you type. Powered by TypeSafe Jev, works offline.
+1
stars, 24h · #16,199
+~33
stars, 7 days · #5,628
+~140
stars, 30 days · #5,272
1.0k
★ total · +3% this week
101
forks · 6 open issues
Star history (as recorded here)
LanguageTypeScript
LicenseMIT
Created2026-09-22 (1mo ago)
Last push29d ago
Watchers3
OwnerUser
Links
- GitHub: github.com/anishfn/shapeshift
- Homepage: https://shapeshiftui.vercel.app
- Releases · Issues · Hacker News mentions
README excerpt
# Shapeshift **An input that becomes what you mean.** One text box that morphs into the right UI as you type — an event card, a checklist, a timer, a color picker, a bill splitter, a poll, a converter and more. Try it live · Watch the full 60-second demo (1080p60) [code] Intent is classified by TypeSafe AI's **Jev** model: one call answers 14 typed questions in parallel (which card, plus signals like "is it a video call?", "is it urgent?"). Everything else — dates, amounts, units, math — is deterministic code. **Jev decides, code computes.** It works **fully offline by default** with a built-in keyword classifier, so you can run it without an account. ## Quick start Requires Bun 1.2+. [code] Open http://localhost:3000 and start typing. Press / to see every card type. ### Use the online Jev model (optional) [code] Restart `bun dev`. The latency readout in the bottom-right corner switches from `jev-offline` to `jev-1.13.0`. The key is only ever read on the server (`/api/intent`); it never reaches the browser. If the API is unreachable or rate-limited, Shapeshift quietly falls back to offline mode. | Variable | Default | What it does | | --- | --- | --- | | `TYPESAFE_API_KEY` | _(empty)_ | Enables the online model. Empty or placeholder values keep you offline. | | `JEV_MODEL` | `jev-1.13.0` | Pinned model version. | | `NEXT_PUBLIC_USE_MOCK` | `false` | `true` forces offline even with a key. | | `NEXT_PUBLIC_SITE_URL` | `http://localhost:3000` | Used for Open Graph metadata. | ## Card types | Card | Try | | --- | --- | | Event | `lunch with rahul and anna tomorrow` | | Reminder | `remind me to pay rent tomorrow urgent` | | Checklist | `buy milk, eggs, bread and coffee` | | Timer | `25 min focus` | | Habit | `gym 3x a week` | | Color | `#ff6b35`, `tiffany blue`, `minecraft diamond` | | Split | `split 2400 between 3` | | Expense | `spent 450 on uber` | | Convert | `5 miles in km`, `72f to c` | | Calculate | `18% of 3450` | | Trip | `flight to goa next weekend` | | Poll | `pizza or burgers for friday?` | | Contact | `rahul 98200 12345 rahul@mail.com` | | Bookmark | `https://vercel.com/blog check later` | | Countdown | `days until christmas` | | Time zone | `3pm pst in ist`, `what time is it in tokyo` | | Random | `roll 2d6`, `flip a coin`, `pick one: tacos, sushi or pizza` | | Goal | `read 12 books this year, 4 done` | | Note | anything else | Saved cards live in your browser (`localStorage`) until you delete them. Click one to edit it. ### Keyboard | Key | Action | | --- | --- | | Enter | Save the card | | Esc | Clear (or cancel an edit) | | Tab | Keep a faint preview | | ← → | Choose between "Did you mean" chips | | / | Open every card type | URL flags: `?debug=1` shows every probability; `?demo=1&loop=1` plays a scripted demo. ## How it works Raw model output flickers as you type, so a small state machine turns confidence into calm UI states. A card only changes when a challenger wins twice in a row (or is very sure), and signal badges use an