Project Info
This project did not submit a demo video on Devpost.
Inspiration
Coding plans like Claude Code and Codex feel slightly different day to day — some days the same model thinks longer, some days it's sharper, some days worse. And which model "gets" your taste is deeply personal. We wanted one place that turns both into a daily reading you'd actually open — like an old almanac (黄历) that tells you what's auspicious today.
What it does
A single dashboard with four organs hanging off one personal eval harness: 运势 — Capability fortune. 18 deterministic, auto-graded tasks run against every model → a daily IQ, latency, cost, and an 8-day trend. It tells you whether today is a "spend tokens" or "save tokens" day. 缘分 — Value match. A short questionnaire of subjective dilemmas (rank car brands, recline the seat?, tabs vs spaces…). We force a real verdict out of each model, then match them to you — revealing your "AI soulmate" on a radar chart. Astrology skin. Each model is charted from its release date + provider HQ; you enter your birthday. Fun on the surface, honest underneath. 调和 — Harmonize loop. Inject your taste into the least-aligned model, then re-score on held-out dilemmas it never saw — a gain means generalization, not memorization (the guardrail against a sycophancy machine). Plus an MCP server so any agent can score itself, 5 completely different themed layouts, and 12 languages.
How we built it
Backend: Python + FastAPI, async httpx to Claude / GPT / DeepSeek. A deterministic astrology engine, footrule + agreement matching, an autograder, and an MCP server. 40 passing tests. Frontend: React + Vite + TypeScript. Five bespoke layouts (not recolors): a woodblock almanac, a celestial natal-chart oracle, a brutalist court docket, a zen-ink scroll, and a modern glass dashboard. Real provider brand SVGs, Recharts, Framer Motion. Deploy: Vercel (FastAPI serverless + static SPA), runs keyless from committed seed data. Built start-to-finish with Claude Code.
Challenges we ran into
Making models commit — they're tuned to hedge, so we force strict JSON verdicts with no abstaining. Separating honest measurement from noise (a held-out set keeps "alignment" from becoming flattery). Building five real layouts rather than five palettes. And provider quirks: Codex needs the Responses API, Opus rejects temperature, GPT-5 and DeepSeek-v4 are reasoners.
Accomplishments we're proud of
Five genuinely distinct, animated UIs; a real personal eval harness with a held-out honesty guardrail; an MCP surface; 12-language support; and a keyless public deploy judges can click.
What we learned
Models hedge unless you constrain them; small daily benchmarks are mostly noise unless you're honest about it; and a fun skin can carry a serious idea — model value-alignment — further than a dry chart.
What's next
Crowdsource the daily probe so nobody pays the full token cost, hunt for real weekly periodicity near quota resets, add Gemini / Qwen / Grok live, and expand the harmonize loop.
大模型黄历 · Astro-LLM
The LLM almanac. One dashboard that tells you, every day, (1) which model is sharp today and whether you should spend or save your tokens, and (2) which model actually shares your values — all wrapped in an astrology / weather-report skin that's fun on the surface and a real personal eval harness underneath.
It looks like a fortune-telling almanac. It's actually a benchmark.
▶ Live demo: https://2-actual-hack.vercel.app · Repo: https://github.com/EthanPany/astro-llm

Five completely different themed layouts (almanac · oracle · court · ink · aurora), a step-by-step value-match quiz, and a live model-fortune board. Full walkthrough:
docs/showcase.mp4.
Why
Coding plans (Claude Code, Codex, …) feel slightly different day to day — sometimes the same model thinks longer, sometimes it's sharper, sometimes worse. And which model "gets" your taste is deeply personal. Astro-LLM turns both into a daily reading:
| Organ | Astrology name | What it really measures |
|---|---|---|
| Capability probe | 运势 fortune | Is the model sharp today? — 18 deterministic, auto-graded tasks → an IQ, latency, cost, refusal rate, trend. |
| Value matcher | 缘分 affinity | Does it judge like you? — a bank of subjective dilemmas; we measure agreement (footrule + verdict match). |
| MCP server | — | How an agent runs the test on itself. |
| Harmonize loop | 调和 harmony | Can we nudge a model toward you? — inject your taste, re-test on held-out dilemmas. |
The "luck" is the skin; the numbers underneath are real. See the honesty note at the bottom of the dashboard.
Quickstart (local)
Requirements: Python 3.11+, uv, Node 20+.
cp .env.example .env # paste your API keys (all optional — see below)
make install # backend venv (uv) + frontend deps
make seed # probe live models, write committed seed JSON (optional)
make dev-backend # API on http://localhost:8000 (terminal 1)
make dev-frontend # UI on http://localhost:5173 (terminal 2)
Open http://localhost:5173.
No keys? It still works. The repo ships committed seed data, so the dashboard,
verdict grid and value-match all render offline. Keys unlock live re-probes
(↻ 实时巡检), the live custom-dilemma panel, and the harmonize loop.
Providers
ANTHROPIC_API_KEY, OPENAI_API_KEY, DEEPSEEK_API_KEY are wired and verified.
GEMINI_API_KEY / QWEN_API_KEY are implemented; without them those models show
clearly-labelled simulated data. Adding a key flips them to live on the next make seed.
Deploy (one command)
make up # docker compose: builds the frontend, serves SPA + API on :8000
# or:
docker build -t astro-llm . && docker run -p 8000:8000 --env-file .env astro-llm
In production FastAPI serves the built SPA and the API from the same origin, so there's nothing else to configure. The image bakes in the seed data, so it renders even with zero keys.
Architecture
backend/ FastAPI + httpx + pydantic + SQLite (uv-managed)
app/
providers/ one adapter per provider (OpenAI/Anthropic/DeepSeek/Gemini/Qwen)
benchmarks/ dilemma bank, capability tasks, judge + capability runners,
matching (footrule + agreement), scoring (IQ + suggestion)
astrology/ deterministic zodiac / numerology / fortune / compatibility
loop/ harmonize (train/test guardrail)
storage/ SQLite DAL + seed generator
service.py assembly: runs + astrology -> AlmanacCards + headline
api/routes.py REST API | mcp_server.py MCP tools | scheduler.py
frontend/ React + Vite + TypeScript, handwritten CSS, GSAP, hand-drawn SVG charts
Full data contracts: ARCHITECTURE.md.
Earlier prompt harness
experiments/astro-twin-v1 preserves the earlier AstroTwin dual-pipeline
prompt-testing harness. It remains runnable as a standalone Python project and
records its exact source revision in SOURCE_REPOSITORIES.md.
API
GET /api/dashboard · GET /api/models · GET /api/dilemmas ·
POST /api/match · POST /api/harmonize · POST /api/judge · GET /api/health
MCP
make mcp # python -m app.mcp_server (stdio)
Tools: list_models, get_almanac, judge_dilemma, match_me,
score_model_against_user. Point any MCP client (e.g. Claude Desktop) at it and an
agent can score itself against the benchmark.
Hourly almanac
Set ENABLE_SCHEDULER=true to probe available models on an interval (PROBE_INTERVAL_MINUTES),
persisting real runs to SQLite so the trend becomes measured data over time.
Tests
make test # 34 tests: astrology, matching, scoring, graders, judge parsing,
# harmonize, API (offline via TestClient + monkeypatched seed)
Design
Handwritten CSS only — no Tailwind, no component library, no chart library. Charts are hand-drawn SVG. Type: Fraunces (display) + Space Grotesk (UI) + Space Mono (numbers). GSAP drives entrance reveals, number count-ups, and chart draw-on.
Honesty note
The capability score is a real stopwatch + autograder. The value-match measures how a model was tuned to present itself, not a hidden soul. The harmonize loop is scored on held-out dilemmas the model never saw during tuning — the guardrail that keeps "alignment" from collapsing into a flattery machine. The astrology is for fun; we say so.
⚠ Rotate any API keys that were shared in plaintext before making this repo public.
Analysis
View
Metric
No commits on this project resolved to a GitHub account.
Technology
- CSSIn code
- FastAPIIn code
- HTMLIn code
- PythonIn code
- ReactIn code
- TypeScriptIn code
- AnthropicClaimed
- OpenAIClaimed
- VercelClaimed
6 of 9 appear in the indexed code. 3 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
304 KB
Source files
110
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
EthanPany/astro-llm
139 files · 7.0 MB · @ 623ea0d
Structure
Interface
84 files · 60%Screens, components and styles rendered to the user.
API & routing
3 files · 2%Request entry points: routes, handlers and controllers.
Application logic
26 files · 19%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Python40%
- TypeScript34%
- CSS18%
- Markdown8%
- HTML0%
- YAML0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
frontend/package.json
npm · 12- framer-motion
- gsap
- lucide-react
- react
- react-dom
- react-icons
- recharts
- +5 more
backend/pyproject.toml
pypi · 11- apscheduler
- fastapi
- httpx
- mcp
- pydantic
- pydantic-settings
- python-dotenv
- uvicorn[standard]
- +3 more
requirements.txt
pypi · 6- apscheduler
- fastapi
- httpx
- pydantic
- pydantic-settings
- python-dotenv
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.