Back up Orbital.nyc reflections (weekly logs, monthly logs, quarterly log reflections, and quarterly community updates with wins/lessons/intentions/talk) as Markdown to Obsidian...
Back up weekly, monthly, and quarterly reflections from Orbital.nyc to Obsidian as Markdown files. This covers two distinct Orbital features:
/log/weekly/, /log/monthly/, /log/quarterly/)/member/updates/)Important: Only back up the authenticated user's own content. Never access other members' posts.
orbital.nyc (ID: y3bbe4uwhmgy4sha32vzdplqpa, fields: email, password)~/Obsidian/cag/ (output goes to Orbital/ subfolder)pip install markdownify# Incremental sync (skips unchanged notes)
python skills/orbital/assets/sync.py
# Full re-sync (ignore last_sync timestamp)
python skills/orbital/assets/sync.py --force
The script is idempotent — safe to run multiple times:
updatedAt is before the last sync timestamp~/Obsidian/cag/Orbital/.last_syncDirectory: ~/Obsidian/cag/Orbital/
| Type | Filename | Example |
|---|---|---|
| Weekly log | {period}.md |
2026-W03.md |
| Monthly log | {period}.md |
2026-01.md |
| Quarterly log | {period}.md |
2025-Q4.md |
| Quarterly update | {quarter}-update.md |
2025-Q4-update.md |
Orbital uses Supabase for authentication. The sync script handles this automatically:
y3bbe4uwhmgy4sha32vzdplqpaAuthorization: Bearer <token> header on all API calls| Field | Value |
|---|---|
| Supabase URL | https://avlgvxtubpfmwtyhvsis.supabase.co |
| Anon Key | sb_publishable_K-FozEyE7nhPRcNJ7Jjy3w_a7fVN0B6 |
| Auth Endpoint | POST /auth/v1/token?grant_type=password |
| Token Lifetime | 3600 seconds (1 hour) |
GET https://orbital.nyc/api/account/notes
Authorization: Bearer <supabase_jwt>
| Param | Required | Description |
|---|---|---|
span |
Yes | Number of days to look back (use 3650 for full archive) |
types |
Yes | Comma-separated: weekly, monthly, quarterly |
includeIncomplete |
No | true/false |
weekStartDay |
No | 1 = Monday |
timezone |
No | e.g. America/New_York |
Each note has a noteContent object:
default: freeform HTML (used by weekly notes)sections[]: structured Q&A with heading and content HTML (used by monthly/quarterly)Three-step process: get member ID, get editions, get posts per edition.
Get member ID:
GET https://orbital.nyc/api/account/member → .member.id
Get editions:
GET https://orbital.nyc/api/networks/member/tasks/history
Editions stored as 1:Q4 2025 — strip 1: prefix for queries.
Get posts:
GET https://orbital.nyc/api/networks/member/posts/user/{memberId}?type={type}&edition={edition}
Post types: win, lesson, poll
The poll type covers multiple sections, differentiated by promptId:
| promptId | Section | Description |
|---|---|---|
| (none) | Wins | type=win — separate type |
personal |
Lessons | Personal growth |
work |
Lessons | Work/project insights |
field |
Lessons | Industry observations |
change |
Intentions | Things to do differently |
sustain |
Intentions | Things to keep doing |
annual-reflection |
Intentions | Year-end reflection (Q4 only) |
rituals |
Intentions | Rituals and practices |
links |
Talk | Media recommendations |
questions |
Talk | Questions for community |
ask |
Talk | Asks/requests |
give |
Talk | Offers to community |
qol |
Talk | Quality of life tips |
feedback |
Talk | Meta feedback |
New promptIds may appear as Orbital evolves. The sync script handles unknown promptIds by title-casing them and placing them in an "Other" section.
Each post has: id, type, authorId, lead (headline), body (full text), url (optional link), promptId, dateCreated, finalized, finalizedAt.
| Error | Cause | Recovery |
|---|---|---|
401 Unauthorized |
Token expired or invalid | Script auto-authenticates each run |
| Empty notes array | No reflections in span | Increase span (default: 3650 days) |
| 1Password error | Missing credentials | Verify item y3bbe4uwhmgy4sha32vzdplqpa exists |
markdownify missing |
Python dependency | pip install markdownify |
Unknown promptId |
Orbital added new question | Captured in "Other" section automatically |
/api/account/memberdefault HTML; monthly/quarterly log notes use structured sectionsnull promptIds on lessons — handled as uncategorizedy3bbe4uwhmgy4sha32vzdplqpa (not name) to avoid ambiguity