vccs
Vue 3용 차트 컴포넌트 모음, Recharts에서 포팅
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Space traffic triage for university CubeSat teams. This slice ingests public CelesTrak SOCRATES close-approach warnings, ranks them, and shows the result on a three-panel dashboard. The demo satellite is SwissCube (NORAD 35932), an EPFL 1U CubeSat in a roughly 685 km sun-synchronous orbit with no thrusters.
The center panel is a CesiumJS globe (Resium, client-only). The right panel is the Grok voice copilot: hold to talk, or use Brief me if the mic or the realtime API is unavailable. The Imagine render of the selected encounter sits on the globe and under the transcript.README 전문 보기 ↗A Grok voice copilot that reads real collision warnings, throws out the false alarms, and tells you, out loud, which one actually matters. Now with a live mission room on SpacetimeDB, so the whole team sees the same picture.
🌍 Live site · 📡 CelesTrak SOCRATES · Built for the SpaceXAI Make it Legendary hackathon
Not for operational use. Orbit Watch is a demo of triage and explanation built on public data. It does not replace the 18th Space Defense Squadron, a conjunction-assessment team, or a maneuver decision, and it never gives maneuver orders.
On Sunday, Oct 4, 2026 at 9:26 PM ET (2026-10-05 01:26:28 UTC), SwissCube (NORAD 35932), a 1U CubeSat built by EPFL students, is predicted to pass 621 meters from Soviet rocket debris, SL-8 DEB (NORAD 19831), at 13.881 km/s (about 50,000 km/h).
| Primary | SwissCube · NORAD 35932 · ~685 km sun-synchronous · no thrusters |
| Secondary | SL-8 DEB · NORAD 19831 |
| Time of closest approach | 2026-10-05 01:26:28.592 UTC |
| Miss distance | 0.621 km (CelesTrak SOCRATES) · 0.691 km (our own SGP4 run) |
| Relative speed | 13.881 km/s |
| Max probability | 5.614 × 10⁻⁶ |
| Verdict | Act (priority score 84.0), the one pass the team should look at. Not a maneuver order. |
Check the SwissCube report on CelesTrak yourself →
CelesTrak's SOCRATES screens the whole tracked catalog, and one weekly run lists 183,612 predicted close approaches. Big operators have flight dynamics teams. University CubeSat teams have a grad student and a spreadsheet. Most warnings are noise, but you can't safely ignore any of them.
flowchart LR
A[CelesTrak SOCRATES<br/>close-approach warnings] --> B[False-alarm filter]
C[CelesTrak GP / OMM orbits] --> D[Independent SGP4 check]
B --> E[Risk ranker]
D --> E
E --> F[3D Cesium globe]
E --> G[Grok Voice + Brief me]
E --> H[Grok Imagine render]
G --> I[(SpacetimeDB<br/>mission room)]
F --> I
For SwissCube this week:
From 21 alarms to 1 decision.
Triage and voice
get_ranked_warnings, get_encounter, explain_dismissed, focus_encounter) and can fly the globe to the pass it's talking about.Globe and proof
Any CubeSat
Live mission room (SpacetimeDB)
Grok briefed: SL-8 DEB 621 m at 9:26 PM.Operator-1234) and remembers it.Calibrated for CubeSats. The build plan's original probability term (log10(p)+7)/4 fits ISS-class events. Public SOCRATES probabilities for a CubeSat that can't maneuver sit around 1e-6 to 1e-5, so that scale left a 621 m head-on pass in the low 60s. The probability term is now clamp((log10(p)+8)/3, 0, 1) (1e-8 → 0, 1e-5 → 1), which puts SL-8 DEB at 84. The 1e-4 NASA CARA figure is an operational maneuver threshold, not what this public screen reports for SwissCube, so it isn't the Act gate here.
Stale data (more than 3 days since epoch) and dilution (dilution larger than the miss) show as flags on the card. They don't change the score.
Both use SGP4, but they start from orbit data published at different times. CelesTrak screened from earlier element sets. Ours are real CelesTrak GP data fetched later on Oct 3. Public orbit data is uncertain by hundreds of meters, which is why SOCRATES also reports a probability. Two independent calculations about 70 m apart tell you the threat is real.
Requires Node.js and npm.
git clone https://github.com/ArunimaV/orbit-watch.git
cd orbit-watch
npm install
cp .env.example .env.local # then add your XAI_API_KEY (see below)
npm test # optional
npm run dev
Open http://localhost:3000. The app opens on SwissCube vs SL-8 DEB.
| Variable | Required | Purpose |
|---|---|---|
XAI_API_KEY | For live voice | Server-only key from console.x.ai for realtime voice, Brief me, text-to-speech, and new Imagine renders. Never ship it to the browser. Without it, the app runs in mock mode: the mic is off, Brief me still reads the ranker's text, and the committed SwissCube render is shown. |
NEXT_PUBLIC_SPACETIME_URI | For the mission room | SpacetimeDB server, e.g. https://maincloud.spacetimedb.com or http://127.0.0.1:3100. Public, not a secret. |
NEXT_PUBLIC_SPACETIME_MODULE | For the mission room | Database name, e.g. orbit-watch. Both SpacetimeDB values must be set or the room stays off. |
ORBIT_WATCH_OFFLINE | No | 1 skips CelesTrak and serves data/fixtures/ only. |
DEMO_NOW | No | Fixture-mode clock (ISO). Empty uses 2026-10-04T16:00:00Z (noon ET Oct 4), so SL-8 DEB stays ranked and reads as "tonight." |
NEXT_PUBLIC_CESIUM_ION_TOKEN | No | Unused. The globe uses Natural Earth II imagery bundled with Cesium. |
The module lives in spacetime/. Generated client bindings are in lib/spacetime/module_bindings/, and spacetime.json points at ./spacetime with Maincloud as the default server.
curl -sSf https://install.spacetimedb.com | sh
spacetime --version
Add ~/.local/bin to your PATH if the installer asks, then open a new terminal.spacetime login
npm install --prefix spacetime
spacetime publish orbit-watch --server maincloud
If orbit-watch is taken, pick another lowercase name with dashes and use it below. Re-run the same command to update the module. Compatible schema changes keep the data..env.local:
NEXT_PUBLIC_SPACETIME_URI=https://maincloud.spacetimedb.com
NEXT_PUBLIC_SPACETIME_MODULE=orbit-watch
npm run dev, then open http://localhost:3000 in two windows side by side. Join with a different callsign in each. The header shows "2 watching." Set Act on SL-8 DEB in one window, add a note, or hit Brief me, and watch it appear in the other.Inspect the data:
spacetime sql orbit-watch "SELECT * FROM threat_status" --server maincloud
Swap in note, presence, or feed. You can also browse the tables on the SpacetimeDB dashboard.
Fully local instead of Maincloud. Next.js uses port 3000, so run SpacetimeDB on 3100:
spacetime start --listen-addr 127.0.0.1:3100
# in another terminal, from the repo root:
npm install --prefix spacetime
spacetime publish orbit-watch --server http://127.0.0.1:3100 --yes
and set NEXT_PUBLIC_SPACETIME_URI=http://127.0.0.1:3100.
| Table | Holds | Written by reducer |
|---|---|---|
threat_status | Watching / Act / Dismissed per encounter, who set it, when | setStatus |
note | Per-encounter note thread (author, text, time) | addNote |
presence | One row per live connection with callsign and last heartbeat | heartbeat (removed on disconnect, stale rows pruned after 45 s) |
feed | System and Grok lines. Duplicates within 20 s are dropped, and the latest 40 are kept. | postFeed |
Every reducer validates its input first: allowed status values, length limits (names 40, notes 280, feed 320 characters), a safe character set, and no control characters. Clients subscribe to the tables and don't poll.
FORMAT=JSON and propagated with satellite.js v7 json2satrec (SGP4). TLEs aren't used, because catalog numbers already exceed five digits.What's real. data/fixtures/socrates-sample.json holds the real SOCRATES Plus screen for SwissCube (21 rows, data current as of 2026-10-03 00:19:27 UTC). The GP files in data/fixtures/gp/ are real CelesTrak element sets fetched on Oct 3 for 11 objects. The demo serves this committed snapshot by default so judging is stable. npm run ingest pulls a fresh screen. Lookups for other satellites (/api/lookup) make one live SOCRATES request with an 8-second timeout, cached for 10 hours.
CelesTrak usage policy. We cache under data/, poll jsonDir.php at most once an hour, download the screen only when FILE_MTIME changes, refetch a GP set only when the cache is more than 2 hours old, and stop on the first non-200 response with no retries. HTTPS to celestrak.org times out from some networks, so a transport failure is tried once over plain http:// with the same path.
Data courtesy of CelesTrak (Dr. T.S. Kelso).
GET /api/conjunctions?norad=35932&horizon=168: ranked cards plus dismissed counts by reason.GET /api/lookup?norad=43017&horizon=168: the same ranked payload for any other catalog number.GET /api/encounter/[id]: both OMMs through json2satrec, positions every 10 s from TCA−15 min to TCA+15 min, and our own minimum separation.POST /api/voice/token: mints a short-lived realtime client secret (the key stays on the server).POST /api/voice/tools: get_ranked_warnings, get_encounter, explain_dismissed, focus_encounter.POST /api/brief: short briefing from grok-4.20-0309-non-reasoning, with the ranker text as fallback.POST /api/tts: Eve voice, audio/mpeg.GET /api/imagine/[id]: Grok Imagine render (grok-imagine-image-quality), cached, with the committed public/renders/swisscube-sl8deb.jpg as the default and fallback.The Next.js preset works as is. next.config.ts copies Cesium's static files into public/cesium when the config loads, so next build publishes them. Set XAI_API_KEY for live voice. To enable the mission room on the live site, also add NEXT_PUBLIC_SPACETIME_URI and NEXT_PUBLIC_SPACETIME_MODULE and redeploy, because Vercel reads NEXT_PUBLIC_* at build time. Without them, the live site runs the solo app.
| Cursor | All code written in Cursor. Several Cursor cloud agents built features in parallel on separate PRs (#1–#16), with small, frequent commits. |
| Grok Voice API | Realtime push-to-talk (grok-voice-latest) with tool calls, plus TTS for briefings |
| Grok Imagine | Artist's renderings of each encounter |
| Grok API | Fast spoken briefings |
| SpacetimeDB | Real-time backend for the shared mission room (tables, reducers, subscriptions, presence) |
| CelesTrak | SOCRATES close approaches and GP/OMM orbit data |
| satellite.js | SGP4 propagation |
| Next.js + CesiumJS + Resium | App and 3D globe |
| Vercel | Hosting |
| Grok Bot | Planning, research, and coordinating the build agents. See docs/planning-log.md. |
Conjunction and orbit data from CelesTrak (Dr. T.S. Kelso). SwissCube was built by students at EPFL. satellite.js, CesiumJS, and SpacetimeDB. Predictions are based on public orbit data and are not for operational use.
Made with 🛰️ for every team launching their first satellite.