aksara-karir

activetype/moc

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