尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Curate Your Sources. Get Your Dispatch.
MyJunto lets you build a junto — a curated group of Twitter/X voices you trust — and receive a daily AI-synthesized dispatch: signal, not noise.
Named after Ben Franklin's intellectual discussion groups.檢視完整 README ↗Curate Your Sources. Get Your Dispatch.
MyJunto lets you build a junto — a curated group of Twitter/X voices you trust — and receive a daily AI-synthesized dispatch: signal, not noise.
Named after Ben Franklin's intellectual discussion groups.
Live at myjunto.xyz
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS |
| Database | Supabase (Postgres) |
| Hosting | Vercel |
| Auth | NextAuth — Twitter OAuth + Google OAuth |
| AI | Claude Haiku (analyst profile synthesis + dispatch generation) |
| Twitter Data | Apify (~$0.25/1000 tweets) |
| Resend |
pull-content (every 6h)
└─ Loads active sources → starts Apify batch run → saves pending run ID
collect-twitter (runs ~20 min after pull-content, then every 5 min for ~25 min)
└─ Polls Apify for results
└─ Stores tweets → backfills avatar_url / display_name from Apify author data
└─ Triggers Claude Haiku profile update when new tweets stored
└─ Stale profile sweep: re-analyzes any profile not updated in 48h (3/cycle cap)
generate-newsletters (every 5 min in window after collect)
└─ Loads pending dispatches → reads content_twitter
└─ Claude Haiku synthesis → delivers via Resend (email) / Telegram
| Route | Description |
|---|---|
/ | Landing / home |
/juntos | Browse all public juntos |
/junto/[id] | Junto detail — sources, recent dispatches |
/create | Create a new junto |
/positions | Heatmap + table of analyst positions across all sources |
/positions/[ticker] | Detail view for a specific ticker/sector |
/sources | Browse all tracked sources |
/sources/[handle] | Source profile — analyst summary, positions, recent tweets |
/newsletters | Browse dispatches |
/newsletter/[id] | Dispatch detail |
/dashboard | User dashboard — your juntos, subscriptions |
/settings | Account settings |
# Prerequisites: Node 20+ (use nvm)
nvm use 20
# Install
npm install
# Dev server
npm run dev
# Build
npm run build
Create .env.local with:
SUPABASE_URL=https://xxx.supabase.co
SUPABASE_ANON_KEY=xxx
SUPABASE_SERVICE_ROLE_KEY=xxx
ANTHROPIC_API_KEY=xxx
APIFY_API_KEY=xxx
TWITTER_CLIENT_ID=xxx
TWITTER_CLIENT_SECRET=xxx
GOOGLE_CLIENT_ID=xxx
GOOGLE_CLIENT_SECRET=xxx
RESEND_API_KEY=re_xxx
[email protected]
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=xxx
CRON_SECRET=xxx
junto/
├── src/
│ ├── app/
│ │ ├── api/
│ │ │ ├── cron/ # pull-content, collect-twitter, generate-newsletters
│ │ │ ├── juntos/ # CRUD for juntos
│ │ │ ├── sources/ # Source management
│ │ │ ├── positions/ # Aggregated analyst positions
│ │ │ ├── newsletters/ # Dispatch list/detail
│ │ │ └── ...
│ │ ├── create/ # Junto creation
│ │ ├── juntos/ # Browse juntos
│ │ ├── junto/[id]/ # Junto detail
│ │ ├── positions/ # Positions heatmap + table
│ │ ├── sources/[handle]/ # Source profile
│ │ └── dashboard/ # User dashboard
│ ├── lib/
│ │ ├── db/ # Supabase queries
│ │ ├── twitter/ # Apify tweet client
│ │ ├── synthesis/ # Claude Haiku: profile-updater, newsletter generation
│ │ └── email/ # Resend delivery
│ └── components/ # Shared UI (top-nav, auth-modal, etc.)
├── vercel.json # Cron job config
├── CLAUDE.md # AI assistant context
└── README.md
| Endpoint | Schedule | Description |
|---|---|---|
/api/cron/pull-content | Every 6h (0:45, 6:45, 12:45, 18:45 UTC) | Start Apify batch for all active sources |
/api/cron/collect-twitter | ~20 min after pull, then every 5 min | Poll Apify results, store tweets, update profiles |
/api/cron/generate-newsletters | Every 5 min (post-collect window) | Synthesize + deliver pending dispatches |
Each source gets an AI-maintained analyst profile (source_analyst_profiles table):
{ stance, since, note } where stance is bullish | bearish | neutral | cautiousProfiles update whenever new tweets are collected, or via stale sweep (any profile not updated in 48h gets re-analyzed, capped at 3 per collect cycle).
Tracked position types: specific tickers (BTC, TSLA, DRO.AX), named commodities (gold, uranium), investable sectors (semiconductors, defense, AI).