Aksara Karir (LMS)
Doc boundary: managerial notes stay in this vault under Projects/aksara-karir/. Architecture, data model, features, testing, and utility docs live only in aksara-karir-lms-docs (no submodule). Policy: [[Projects/aksara-karir/context/doc-ownership|doc ownership]].
Team
| Role | Person |
|------|--------|
| PM + full-stack | [[Resources/People/Prayer MG Terok]] |
| Frontend | [[Resources/People/Yehezkiel Owen Ombuh]] |
TL;DR
LMS for Aksara Karir (online mining/geology training, Indonesia) delivered by Lumen Dev as a one-time project; MVP shipped, currently in unmaintained "done" state. Next milestone: stabilization sprint + subscription proposal so we can take over operational ownership before incidents grow.
Outcome
- Problem: client ran courses via Zoom + WhatsApp + spreadsheets; needed a web LMS for registration, schedule, files, certificates.
- Desired outcome: stable platform we maintain under a paid retainer, with B2B and Zoom-API attendance as future upsells.
- Success metric: zero P0 incidents/month after stabilization, signed retainer ≥ 750k IDR/mo, billing handover off personal credit card.
- Scope (in): Next.js LMS app, Supabase, Cloudflare R2, WAHA, certificates.
- Scope (out): client's Zoom attendance system, marketing site, payment gateway (until client has legal entity).
Status
- Current phase: post-MVP, awaiting stabilization sprint.
- Next milestone: red-flag triage → subscription pitch (anon-grants work on hold — see backlog).
- Target date: 2026-05 (audit + pitch); stabilization through 2026-06.
- Health: yellow — works in prod but several latent risks (no backups, minimal observability — Sentry only; crons not running, single shared admin, single ops owner).
Quick Links
- [[Projects/aksara-karir/context/index|Project context]]
- [[Projects/aksara-karir/decisions/index|Decisions]]
- [[Projects/aksara-karir/backlog/index|Backlog]]
- [[Projects/aksara-karir/runbooks/index|Runbooks]]
- [[Projects/aksara-karir/changelog/index|Changelog]]
- [[Projects/aksara-karir/context/doc-ownership|Ownership + inventory]]
- [[Areas/LumenDev/LumenDev]]
- Technical docs (external): aksara-karir-lms-docs README
Technical documentation (external)
Single entry for agents: README.md on GitHub → features → architecture → data model → utility → testing.
App repo (local): ~/Project/aksara-karir-lms
Project folders (what goes where)
| Folder | Use for | Do not use for |
| ------ | ------- | -------------- |
| context/ | Client, commercial, onboarding, handover; hub [[Projects/aksara-karir/context/index]]. | Technical specs — link to GitHub docs repo instead. |
| decisions/ | ADRs and dated choice records. | Operator procedures — use runbooks/. |
| runbooks/ | Managerial/operator procedures maintained in this vault. | Deep technical runbooks — keep those in docs repo. |
| backlog/ | Prioritized work and owners. | Long-form architecture writeups — use docs repo. |
| changelog/ | Dated narrative of vault/project story. | Git history by default. |
| meetings/ | Meeting-specific notes (add when needed). | Evergreen architecture writeups. |
| archive/ | Superseded notes (add when needed). | Active work. |
One-line test: if every open task and meeting disappeared, would this note still help someone steer the engagement? If yes → context/ or hub sections here; product/engineering depth → docs repo.
Open Decisions
- [[Projects/aksara-karir/decisions/adr-2026-04-26-rls-vs-typeorm-only|RLS or revoke anon (ADR)]] — RLS or revoke anon and standardize on TypeORM-only access?
- [[Areas/LumenDev/clients/aksara-karir/subscription-pricing-model-adr|Subscription pricing (ADR)]] — Tiered retainer vs revenue share vs per-student.
- [[Projects/aksara-karir/decisions/adr-2026-04-26-billing-handover|Billing handover (ADR)]] — Move infra accounts off personal credit card?
Active Backlog
- [[Projects/aksara-karir/backlog/p0-cron-reminders-fix|p0 — cron reminders]] — p0 — mg
- [[Projects/aksara-karir/backlog/p0-backups-supabase-r2|p0 — backups]] — p0 — mg
- [[Projects/aksara-karir/backlog/p1-observability-logging|p1 — observability]] — p1 — mg
- [[Projects/aksara-karir/backlog/p1-r2-garbage-collection|p1 — R2 GC]] — p1 — mg
- [[Projects/aksara-karir/backlog/p1-admin-multi-account-audit|p1 — admin accounts]] — p1 — mg
- [[Projects/aksara-karir/backlog/p1-staging-environment|p1 — staging]] — p1 — mg
- [[Projects/aksara-karir/backlog/p1-billing-handover-aksara|p1 — billing handover]] — p1 — mg
- [[Projects/aksara-karir/backlog/p2-cert-email-resend-impl|p2 — cert email Resend]] — p2 — mg
- [[Projects/aksara-karir/backlog/p2-cert-template-flexibility|p2 — cert templates]] — p2 — mg
- [[Projects/aksara-karir/backlog/p2-b2b-corporate-dashboard|p2 — B2B dashboard]] — p2 — mg
- [[Projects/aksara-karir/backlog/p2-payment-gateway-when-legal-entity|p2 — payment gateway]] — p2 — mg
- [[Projects/aksara-karir/backlog/p3-discount-voucher-logic|p3 — vouchers]] — p3 — mg
- [[Projects/aksara-karir/backlog/p3-zoom-attendance-api|p3 — Zoom attendance API]] — p3 — mg
Backlog (on hold)
- [[Projects/aksara-karir/backlog/p0-rls-or-revoke-anon|p0 — RLS / revoke anon]] — p0 — mg — deferred by choice (2026-05-15)
Recent Changes
- 2026-05-15 — [[Projects/aksara-karir/changelog/2026-05-15-sentry-setup|Sentry wired in app]] — observability partial; see changelog.
- 2026-05-15 — [[Projects/aksara-karir/changelog/2026-05-15-p0-rls-revoke-on-hold|P0 RLS / revoke anon on hold]] — backlog deferred; see changelog.
- 2026-04-26 — [[Projects/aksara-karir/changelog/2026-04-26-onboarding-knowledge-capture|Onboarding knowledge capture]] — captured client, stack, ops, and risk knowledge into vault.
- 2026-05-10 — Split vault vs
aksara-karir-lms-docs; removed submodule.
Risks & Blockers
- Risk: WAHA session drops silently (unofficial WhatsApp) | Impact: scheduled reminders fail, possible WA number ban | Mitigation: follow technical WAHA restart runbook in docs repo; long-term migrate to Meta Cloud API or add email fallback | Owner: mg
- Risk: anon role may have over-broad grants on prod (no RLS) | Impact: PII / payment proof URLs publicly readable | Mitigation: run grants audit, revoke or apply RLS — see [[Projects/aksara-karir/decisions/adr-2026-04-26-rls-vs-typeorm-only|ADR — RLS vs TypeORM]] | Owner: mg
- Risk: no backups (Supabase + R2) | Impact: total data loss on corruption / accidental drop | Mitigation: enable Supabase PITR, R2 lifecycle + offsite copy | Owner: mg
- Risk: all infra billed on personal credit card | Impact: dependency on individual; client cannot operate if Lumen withdraws | Mitigation: billing handover plan, see [[Projects/aksara-karir/decisions/adr-2026-04-26-billing-handover|ADR — billing handover]] | Owner: mg
- Risk: cron reminders not scheduled in Vercel | Impact: 1-hour-before WhatsApp class reminder silently disabled | Mitigation: schedule via Vercel Cron or Supabase scheduled function | Owner: mg
- Risk: single shared admin login | Impact: no audit trail, no per-user revoke | Mitigation: per-admin Supabase users + role table | Owner: mg
- Risk: bus factor of one (mg) for prod access | Impact: outage risk if owner unavailable | Mitigation: shared 1Password vault with co-dev (friend), documented runbooks | Owner: mg
Next Actions
- ~~Run anon-grants audit on prod Supabase — mg — due 2026-05-03~~ (on hold — see [[Projects/aksara-karir/backlog/p0-rls-or-revoke-anon|backlog]])
- Schedule cron reminders + cleanup-expired in Vercel — mg — due 2026-05-03
- Enable Supabase PITR + R2 versioning/lifecycle — mg — due 2026-05-10
- Draft subscription proposal (Indonesian + English) — mg — due 2026-05-10
- Send proposal + stabilization quote to Aksara Karir — mg — due 2026-05-17
Related
- [[Areas/LumenDev/LumenDev]]
- App repo (local):
~/Project/aksara-karir-lms
- Technical docs repo: MG177/aksara-karir-lms-docs
- Initial PRD (Notion): https://www.notion.so/2e8bdcdd44cd80a496ebfa0f467cf493