[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-92304":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":16,"rankGlobal":9,"rankLanguage":9,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":14,"starSnapshotCount":14,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},92304,"amber","SchroederNathan\u002Famber","SchroederNathan","Save it for later",null,"TypeScript",96,12,63,0,20,45.34,"Other",false,"main",true,[],"2026-07-22 04:02:05","# Amber\n\nA save-it-for-later app for the things you want to come back to. Drop in a **link**, an\n**image**, or a **note** and Amber fetches the content, writes a title, a short summary, and\ntags it — then files it into the right collection for you. Everything shows up as a warm\nmasonry feed.\n\nBuilt with Expo (SDK 57) + Convex backend + AI classification via AI SDK.\n\n## Features\n\n- **Capture anything** — links, photos, screenshots, and plain notes, from inside the app (share into Amber from any other app).\n- **Automatic organization** — every saved item is analyzed by an LLM that generates a title,\n  a one-line description, and tags, and sorts it into matching **spaces** (themed collections).\n- **Smart spaces** — create a new space and Amber retroactively pulls in your existing items\n  that belong in it.\n- **Full-text search** across everything you've saved.\n- **Subject stickers** lift the subject out of a photo into a transparent die-cut\n  sticker.\n- **Offline-first feel** — the feed is persisted locally and paints instantly on cold launch,\n  then syncs live.\n- Adaptive light\u002Fdark theming with a warm amber palette.\n\n## Tech stack\n\n| Layer      | What                                                                       |\n| ---------- | -------------------------------------------------------------------------- |\n| App        | Expo SDK 57, React Native 0.86 (New Architecture), Expo Router (typed)     |\n| Backend    | [Convex](https:\u002F\u002Fconvex.dev) — reactive DB, file storage, server actions   |\n| Auth       | [Clerk](https:\u002F\u002Fclerk.com)                                                 |\n| AI         | Vercel AI SDK → Gemini 3.1 Flash-Lite via the AI Gateway                   |\n| Data\u002Fcache | TanStack Query + Convex adapter, persisted to MMKV                         |\n| UI         | react-native-unistyles, Reanimated, Skia, FlashList, Vision Camera         |\n| Native     | Local Expo modules (subject lift, progressive blur) + a share extension    |\n\n## Getting started\n\n### Prerequisites\n\n- [Bun](https:\u002F\u002Fbun.sh) (this project uses bun, not npm\u002Fyarn)\n- Xcode (iOS) and\u002For Android Studio — Amber uses **custom native modules**, so it runs in a\n  **dev client**, not Expo Go.\n- Accounts: a [Convex](https:\u002F\u002Fconvex.dev) project and a [Clerk](https:\u002F\u002Fclerk.com) app.\n\n### 1. Install\n\n```bash\nbun install\n```\n\n### 2. Configure environment\n\nCreate a `.env` file in the project root:\n\n```bash\nEXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...\nEXPO_PUBLIC_CONVEX_URL=https:\u002F\u002F\u003Cyour-deployment>.convex.cloud\n```\n\nSet the backend secrets on your Convex deployment (Convex dashboard or `bunx convex env set`):\n\n```bash\nbunx convex env set AI_GATEWAY_API_KEY \u003Cyour-vercel-ai-gateway-key>\nbunx convex env set CLERK_JWT_ISSUER_DOMAIN https:\u002F\u002F\u003Cyour-clerk-instance>.clerk.accounts.dev\n```\n\n`convex\u002Fauth.config.ts` reads the Clerk JWT issuer from `CLERK_JWT_ISSUER_DOMAIN`, so set it per\ndeployment (dev and prod each get their own instance's domain). The Clerk JWT template must use\n`applicationID: \"convex\"`.\n\n### 3. Run the backend\n\n```bash\nbunx convex dev\n```\n\nThis deploys the functions in `convex\u002F`, watches for changes, and keeps `convex\u002F_generated\u002F`\nin sync.\n\n### 4. Build & run the app\n\n```bash\nbunx expo run:ios      # or: bunx expo run:android\n```\n\nThis builds the dev client and starts Metro. For subsequent runs you can just start Metro:\n\n```bash\nbun start\n```\n\n## Scripts\n\n| Command                 | What it does                                  |\n| ----------------------- | --------------------------------------------- |\n| `bun start`             | Start the Metro dev server                    |\n| `bunx expo run:ios`     | Build and run the iOS dev client              |\n| `bunx expo run:android` | Build and run the Android dev client          |\n| `bunx convex dev`       | Run\u002Fdeploy the Convex backend and codegen     |\n| `bun run lint`          | Lint (ESLint, eslint-config-expo)             |\n| `bunx tsc --noEmit`     | Typecheck (strict)                            |\n\n## Project structure\n\n```\nconvex\u002F            Backend: schema, queries\u002Fmutations, AI processing pipeline\n  schema.ts          items, spaces, spaceItems tables\n  items.ts           item CRUD + search\n  spaces.ts          space CRUD + item membership\n  ai.ts              content extraction + LLM classification (Node action)\n  model\u002Fauth.ts      requireUserId — every function derives the user from Clerk\nsrc\u002F\n  app\u002F               Expo Router routes (auth gate, native tabs, modals, detail screens)\n  components\u002F         Masonry feed, item cards, detail view, etc.\n  lib\u002F               Convex\u002FTanStack client, onboarding, image saving\n  unistyles.ts       Themes, palette, typography\nmodules\u002F           Local native Expo modules\n  subject-lift\u002F      iOS Vision subject cutout\n  progressive-blur\u002F  SwiftUI gradient blur\n```\n\n## How it works\n\nWhen you save something, the client inserts an item as `processing` and Convex schedules a\nbackground action. That action fetches the page (extracting the readable article with Mozilla\nReadability), or reads the image\u002Fnote, and asks the model for a title, description, tags, and\nwhich of your spaces it belongs to. Once done the item flips to `ready` and streams into your\nfeed live. Space names returned by the model are mapped back to real spaces, and creating a new\nspace triggers a pass over your existing items to backfill it.\n\nAuth is enforced server-side: every Convex function resolves the user from the Clerk identity,\nnever from a client-supplied id.\n\n## License\n\nSee [LICENSE](.\u002FLICENSE).\n","Amber 是一款离线优先的「稍后阅读」工具，支持保存链接、图片和文字笔记，并通过 AI 自动生成标题、摘要与标签，智能归类到主题空间中。核心功能包括跨应用分享捕获、LLM 驱动的自动分类（基于 Gemini 3.1 Flash-Lite）、按主题动态聚合历史内容、全文检索、图像主体提取为透明贴纸，以及本地持久化+实时同步的响应式数据流。基于 Expo + Convex 构建，适配 iOS\u002FAndroid 原生体验，适用于个人知识管理、灵感收集、研究资料归档等需长期沉淀碎片信息的场景。",2,"2026-07-08 04:30:02","CREATED_QUERY"]