For developers
API.
sturdy.dance is built on the open-source nungaasia package family — a set of Django apps that handle the boring parts (auth, notifications, interactions, geo, media, ticketing) so the site code can focus on the archive itself.
Each package mounts a REST API under /api/v1/. The endpoints are documented in the package source on GitLab; this page is the index of what's live on this domain.
Live endpoints
- /api/v1/account/ Auth — register, login, logout, password reset, email verification, profile, follow / block graph. Backed by nungaasia-account.
- /api/v1/interaction/ Likes, comments, bookmarks, reactions, ratings, views, shares. The like count on each move note is read via this service. Backed by nungaasia-interaction.
- /api/v1/alert/ In-app notifications and push-device registration. The unread badge in the site header reads ``unread_count`` from this service for the signed-in user. Backed by nungaasia-alert.
- /api/v1/event/ Scheduled events with participants, waitlists, invitations, and iCalendar export. Decoupled from the in-person workshops model (workshops are sturdy_app's own records, not events). Backed by nungaasia-event.
- /api/v1/post/ Generic user-authored posts (text / photo / audio) with reposts, drafts, visibility, content warnings, and audio-track soundtracks. The site's own move notes are editorial — this API is for user-authored content separate from the curated archive. Backed by nungaasia-post.
- /api/v1/subscription/ Subscription tiers and feature gates. The public pricing page is rendered directly from the Tier table by this package — no hardcoded plans. Backed by nungaasia-subscription.
- /api/v1/media/ S3-compatible object storage, presigned uploads, image processing, temporary URLs, thumbnails, and LUTs. The site's editorial photos are served from a CDN today — the API powers user-supplied media when that ships. Backed by nungaasia-media.
- /api/v1/ai/ Content moderation — runs flagged text through Ollama / OpenAI and surfaces a reviewable moderation log. Available to staff for editorial workflow on incoming comments and posts. Backed by nungaasia-ai.
Shared base
All of the packages above depend on nungaasia-core, which ships the shared base — the UUIDMixin / TimestampedModel abstract models, the typed exception family, the cursor + page paginators, the filter / search / ordering DSL, and the DRF authentication wiring used by every API above. Error payloads on these endpoints follow the { "detail": "...", "code": "..." } shape defined there.
Auth
Most endpoints require an authenticated session. Use /register/ to create an account, then /sign-in/ to obtain a session cookie. CSRF is enforced.
Rate limits
DRF throttles apply globally: 60/min for anonymous, 240/min for authenticated. Per-action throttles are stricter — see individual endpoint docs.
Source
Each package is published on the nungaasia GitLab group with its own README, test suite, and changelog.