[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-96738":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":10,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":27,"discoverSource":28},96738,"shapeshift","anishfn\u002Fshapeshift","anishfn","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.","https:\u002F\u002Fshapeshiftui.vercel.app",null,"TypeScript",585,55,302,2,0,235,705,99.04,"MIT License",false,"main",true,[],"2026-09-25 04:01:33","# Shapeshift\n\n**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.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fdemo.gif\" alt=\"Typing 'dinner with priya friday 8pm on zoom' morphs the text box into an event card, then a shopping checklist\" width=\"820\">\n  \u003Cbr>\n  \u003Csub>\u003Ca href=\"https:\u002F\u002Fshapeshiftui.vercel.app\">\u003Cb>Try it live\u003C\u002Fb>\u003C\u002Fa> · \u003Ca href=\"docs\u002Fdemo.mp4\">Watch the full 60-second demo (1080p60)\u003C\u002Fa>\u003C\u002Fsub>\n\u003C\u002Fp>\n\n```\ndinner with priya friday 8pm on zoom   →  Event card · Friday · 8 PM · Priya · Video call\nbuy milk, eggs, bread and coffee       →  Shopping checklist\nsplit 2400 between 3                   →  ₹800 each\nminecraft diamond                      →  #4AEDD9\n```\n\nIntent is classified by [TypeSafe AI](https:\u002F\u002Ftypesafe.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.**\n\n\u003Cp align=\"center\">\u003Cimg src=\"docs\u002Fdiagrams\u002Fjev-fanout.svg\" alt=\"One Jev call answers 14 questions in parallel; a deterministic parser reads the same text for values\" width=\"820\">\u003C\u002Fp>\n\nIt works **fully offline by default** with a built-in keyword classifier, so you can run it without an account.\n\n## Quick start\n\nRequires [Bun](https:\u002F\u002Fbun.sh) 1.2+.\n\n```bash\nbun install\nbun dev\n```\n\nOpen http:\u002F\u002Flocalhost:3000 and start typing. Press \u003Ckbd>\u002F\u003C\u002Fkbd> to see every card type.\n\n### Use the online Jev model (optional)\n\n```bash\ncp .env.example .env.local\n# then set TYPESAFE_API_KEY=... (get one at https:\u002F\u002Fconsole.typesafe.ai\u002Fkeys)\n```\n\nRestart `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 (`\u002Fapi\u002Fintent`); it never reaches the browser. If the API is unreachable or rate-limited, Shapeshift quietly falls back to offline mode.\n\n| Variable | Default | What it does |\n| --- | --- | --- |\n| `TYPESAFE_API_KEY` | _(empty)_ | Enables the online model. Empty or placeholder values keep you offline. |\n| `JEV_MODEL` | `jev-1.13.0` | Pinned model version. |\n| `NEXT_PUBLIC_USE_MOCK` | `false` | `true` forces offline even with a key. |\n| `NEXT_PUBLIC_SITE_URL` | `http:\u002F\u002Flocalhost:3000` | Used for Open Graph metadata. |\n\n## Card types\n\n| Card | Try |\n| --- | --- |\n| Event | `lunch with rahul and anna tomorrow` |\n| Reminder | `remind me to pay rent tomorrow urgent` |\n| Checklist | `buy milk, eggs, bread and coffee` |\n| Timer | `25 min focus` |\n| Habit | `gym 3x a week` |\n| Color | `#ff6b35`, `tiffany blue`, `minecraft diamond` |\n| Split | `split 2400 between 3` |\n| Expense | `spent 450 on uber` |\n| Convert | `5 miles in km`, `72f to c` |\n| Calculate | `18% of 3450` |\n| Trip | `flight to goa next weekend` |\n| Poll | `pizza or burgers for friday?` |\n| Contact | `rahul 98200 12345 rahul@mail.com` |\n| Bookmark | `https:\u002F\u002Fvercel.com\u002Fblog check later` |\n| Countdown | `days until christmas` |\n| Time zone | `3pm pst in ist`, `what time is it in tokyo` |\n| Random | `roll 2d6`, `flip a coin`, `pick one: tacos, sushi or pizza` |\n| Goal | `read 12 books this year, 4 done` |\n| Note | anything else |\n\nSaved cards live in your browser (`localStorage`) until you delete them. Click one to edit it.\n\n### Keyboard\n\n| Key | Action |\n| --- | --- |\n| \u003Ckbd>Enter\u003C\u002Fkbd> | Save the card |\n| \u003Ckbd>Esc\u003C\u002Fkbd> | Clear (or cancel an edit) |\n| \u003Ckbd>Tab\u003C\u002Fkbd> | Keep a faint preview |\n| \u003Ckbd>←\u003C\u002Fkbd> \u003Ckbd>→\u003C\u002Fkbd> | Choose between \"Did you mean\" chips |\n| \u003Ckbd>\u002F\u003C\u002Fkbd> | Open every card type |\n\nURL flags: `?debug=1` shows every probability; `?demo=1&loop=1` plays a scripted demo.\n\n## How it works\n\n\u003Cp align=\"center\">\u003Cimg src=\"docs\u002Fdiagrams\u002Farchitecture.svg\" alt=\"Keystroke, debounced hook, server route, Jev or offline classifier, decide, gate signals, parse, card\" width=\"820\">\u003C\u002Fp>\n\nRaw 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 on\u002Foff hysteresis band.\n\n\u003Cp align=\"center\">\u003Cimg src=\"docs\u002Fdiagrams\u002Fstates.svg\" alt=\"States: input, ghost preview, choose between two chips, committed card, with the thresholds between them\" width=\"820\">\u003C\u002Fp>\n\nThe diagrams are Excalidraw files — open any `docs\u002Fdiagrams\u002F*.excalidraw` at [excalidraw.com](https:\u002F\u002Fexcalidraw.com) to edit them.\n\n| Path | What lives there |\n| --- | --- |\n| `src\u002Fcomponents\u002Fintents\u002Fregistry.ts` | **The extension point.** One entry per card type. |\n| `src\u002Flib\u002Fjev\u002Fquestions.ts` | The Jev question schema |\n| `src\u002Flib\u002Fjev\u002Fmock.ts` | Offline keyword classifier (same output shape) |\n| `src\u002Flib\u002Fparse\u002F` | One deterministic parser per card type |\n| `src\u002Flib\u002Fdecide.ts`, `src\u002Flib\u002Fsignals.ts` | The calm-UI state machine |\n| `src\u002Fcomponents\u002Fshapeshift\u002F` | Shell, chips, palette, saved list, HUD |\n\n### Adding a card type\n\n1. Add the key to `INTENT_KEYS` in `src\u002Flib\u002Fjev\u002Ftypes.ts`.\n2. Add a non-overlapping criterion to `intent` in `src\u002Flib\u002Fjev\u002Fquestions.ts`.\n3. Write a parser in `src\u002Flib\u002Fparse\u002F` and register it in `src\u002Flib\u002Fparse\u002Findex.ts`.\n4. Write a card component in `src\u002Fcomponents\u002Fintents\u002F` and add a registry entry.\n5. Teach the offline classifier in `src\u002Flib\u002Fjev\u002Fmock.ts`, and add tests.\n\nTypeScript will point at anything you missed.\n\n## Development\n\n```bash\nbun run check    # typecheck + lint + tests\nbun test         # parser, decision, signal and classifier tests\nbun run build\n```\n\nStack: Next.js (App Router) · React 19 · TypeScript (strict) · Tailwind CSS v4 · shadcn\u002Fui · Motion · chrono-node · zod.\n\n## License\n\n[MIT](LICENSE)\n","2026-09-24 02:30:12","CREATED_QUERY"]