尚未检测到更新。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).