dumo Design review
Delivery plan · v1.0 · 9 Oct 2026

The grand plan

How we take Dumo from a clickable prototype to an Android app in the hands of 100 South African creators: one gated process, six paid milestones, and every milestone accepted on the client's own phone.

Summary

A TikTok-style vertical video app for South African creators: post short videos, grow a following, and watch a test-money wallet fill up from views and gifts. Real payouts, iOS, LIVE and the Shop come in later phases.

100pilot creators plus their followers
Android 9+Flutter, so iOS can follow from the same code
6paid milestones, each tested on a real phone
13 wksbuild, after 1 wk discovery + 2 wks design
< 2 sfeed start on a mid-range phone on 4G
R0real money moved in the pilot. Wallet is test money only.

Our process

Each stage has an owner and a gate. Nothing moves forward until the gate is passed in writing, so we don't build the wrong thing.

0

Discovery

We send our questions and design assumptions. The client answers on the Questions page.

Owner: Solution architect + PM
1

UX & UI design

A clickable prototype of every pilot screen, plus the admin dashboard. The client pins comments, and we do 2 review rounds.

Owner: Senior designer
2

Build M1–M6

Flutter app, API and admin. Every milestone ends with "done when" tests on the client's phone.

Owner: Tech lead + Flutter devs
3

Pilot release

Google Play closed testing under Dumo's account. 100 creators are invited, and we hand everything over.

Owner: PM + QA
4

Hypercare

2 weeks of fast bug fixes and monitoring while the pilot runs live.

Owner: Tech lead
◆ Gate A: every "Blocks design" question answered
◆ Gate B: design signed off. Changes after this go through change control.
◆ Gate C: each milestone accepted within 5 working days
◆ Gate D: handover checklist signed

Who does what

R = does the work · A = accountable, signs off · C = consulted · I = kept informed.

ActivityClient
(BP Mhlanga)
Solution architectSenior designerPMFlutter devsQA
Discovery questions & answersARCRII
UX flows & UI designACRCCI
Technical plan, stack, cost estimateARICCI
Accounts in the company's nameAR–RI–
App & API buildIACIRC
Admin dashboard buildIACIRC
Milestone testing & acceptanceACCRCR
Status updates (Mon/Thu) & demosICIACC
Change requestsACCRII
Play release & handoverARIRRR

Proposed stack

Our recommendation keeps data and compute in Johannesburg wherever possible, for speed and POPIA. Every library is MIT, Apache 2.0 or BSD and will be listed in the README.

AreaRecommendedWhyAlternative
AppRec.Flutter (Dart), Android 9+ (API 28)One codebase, so iOS follows later. Smooth video on low-end Android. Strong tooling for paged feeds.React Native (Expo)
Video playerRec.video_player / ExoPlayer (Media3) with HLSAdaptive bitrate. We preload the next 1–2 videos and cap resolution when Data Saver is on.better_player_plus
Cloud & regionRec.Google Cloud africa-south1 (Johannesburg)A full cloud region inside South Africa, close to users, which keeps POPIA simple.Supabase. It is fast to build on, but it has no South African region at the time of writing, so data would sit in the EU. This is a trade-off for the client to decide.
AuthRec.Firebase Authentication (phone OTP)Ready-made SMS OTP for cellphone sign-up, with abuse protection (Play Integrity, rate limits). The auth service itself is global.Own OTP flow over Clickatell (SA SMS provider)
APIRec.Cloud Run, TypeScript/Node (Fastify)Scales to zero and is cheap for a pilot. One documented REST API serves both the app and the admin dashboard.Supabase Edge Functions
DatabaseRec.Cloud SQL for PostgreSQL (africa-south1)Relational data suits the wallet ledger, follows and reports. SQL makes auditing easy.Firestore (harder for ledger and reports)
FilesRec.Cloud Storage (africa-south1)Profile photos and thumbnails. Signed URLs for upload.Supabase Storage
VideoRec.Mux VideoAdaptive HLS, a low-bitrate rendition for Data Saver, a 60 s cap enforced on upload, and webhooks when a video is ready. Residency note: stored in US/EU and delivered via a global CDN. This needs a POPIA s72 cross-border clause.Cloudflare Stream
Admin dashboardRec.Next.js (React) on Cloud RunWeb dashboard for users, videos, reports, removals, suspensions and the rand-per-1,000-views setting. Admin roles are checked on the server.Firebase Hosting + React SPA
Crashes & analyticsRec.Firebase Crashlytics + minimal analyticsProves the "15 min with no crashes" test. We only collect the events we need.Sentry (self-hosted)
CI/CDRec.GitHub Actions → Play internal testingEvery merge to main builds a signed AAB. Secrets are stored in GitHub/Cloud Secret Manager.Codemagic
LanguagesRec.Flutter intl with ARB filesAll app text lives in one app_en.arb, ready for isiZulu, isiXhosa, Afrikaans and other languages later.–

Architecture

The app never talks to the database directly. Every request goes through the API, which checks auth and roles. Video goes straight from the phone to the video service and plays back from a CDN.

Solid lines are API calls. Dashed lines are video traffic. On a phone, scroll the diagram sideways.

Data model sketch

Postgres with foreign keys and soft-delete flags. Deleting an account removes the user's videos from Mux and storage through a background job (POPIA right to erasure).

usersid, phone_e164 (unique), dob, role (user|admin), status (active|suspended|deleted), created_at
profilesuser_id, handle (unique), display_name, bio, location, avatar_url, languages[], founding_creator, data_saver
videosid, creator_id, mux_asset_id, playback_id, caption, language, hashtags[], duration_s, earn_enabled, status (processing|live|removed), like_count, comment_count, created_at
followsfollower_id, creator_id, created_at · PK(follower, creator)
likesuser_id, video_id, created_at · PK(user, video)
commentsid, video_id, user_id, body, status, created_at
viewsid, video_id, viewer_id, watched_ms, qualified (bool), created_at · index(viewer, video, created_at)
giftsid, video_id, sender_id, creator_id, gift_type, coin_value, creator_share_zar (70%), created_at · test coins only
wallet_ledgerid, account (creator|platform|test_coin_pool), user_id, entry_type (views|gift|subscription), amount_cents, ref_id, created_at · double-entry, test money
reportsid, reporter_id, target_type (video|user|comment), target_id, reason, note, status (open|actioned|dismissed), handled_by, handled_at
blocksblocker_id, blocked_id, created_at
admin_settingskey, value, updated_by, updated_at · e.g. zar_per_1000_views, gift_creator_share
audit_logid, actor_id, action, target, before, after, created_at · every admin action

Business rules

These rules drive both the wallet and the spreadsheet check in Milestone 4. Values marked "assumption" need the client's confirmation (see Questions).

Qualified view

Watched for at least 3 s, by someone who is not the creator, and not the same viewer on the same video within 30 minutes.

Assumption · confirm
View earnings

(qualified views ÷ 1,000) × the admin's rand rate, rounded to the cent and credited to the ledger daily.

Rate set in admin
Gifts

Viewers send gifts with free test coins. The creator's wallet shows 70% of the gift's rand value, and 30% goes to the platform ledger.

From brief
Age

Date of birth at sign-up. Under 13 cannot join. Ages 13–17 can watch and post, but their wallet is locked with an "Earn from 18" message.

From brief
No real money

No payment SDK in the build. Cash out shows "Coming soon", and every rand amount is labelled test money.

From brief
For You ranking

score = likes × 2 + comments × 3 + qualified views ÷ 10, decayed by age (half-life 24 h). Videos from blocked users are never shown.

Assumption · confirm

Milestones

The scope and "done when" tests are copied from the brief. Payment is released only when every test passes on the client's phone.

#MilestoneBudgetWeeksScopeDone whenDesigned screens
1Foundation10%2
  • Written technical plan: stack, services, monthly running cost estimate
  • GitHub repo, hosting and accounts set up in the company's name
  • Sign-up and log-in with cellphone number and SMS code
  • Empty screens and bottom navigation matching the prototype: Home, Discover, Post, Wallet, Profile
  • The client installs a test build on their own Android phone
  • The client can sign up, log out and log back in with their number
  • All code is visible in the company's GitHub
Welcome
Phone
OTP
2Video feed20%3
  • Record or pick a video (up to 60 s), add a caption and language, post it
  • Vertical swipe feed with autoplay, likes, comments and share link
  • "For You" (newest and most liked) and "Following" tabs
  • 5 test users can post videos and see each other's in the feed
  • Swiping, likes and comments work without crashes for 15 minutes of use
  • Video starts within about 2 seconds on 4G
Feed
Post
Comments
3Profiles and following15%2
  • Profile page: photo, name, handle, bio, location, video grid, follower counts
  • Follow and unfollow, search for creators and hashtags
  • Data Saver switch that plays the low-bitrate stream
  • Following someone puts their videos in the Following tab
  • Search finds a creator by name and a video by hashtag
  • Data Saver visibly lowers video quality and data use
Creator
Discover
My profile
4Creator wallet (test money)15%2
  • Count qualified views per video (exclude the creator's own and repeat views within a short time)
  • Wallet screen with earnings by views, gifts and subscribers, shown in rand
  • Test gifts that viewers can send with fake coins; creator sees 70% of each gift in the wallet
  • Admin setting for the rand value per 1,000 views
  • Views and test gifts update the wallet correctly, checked against a spreadsheet
  • No real payment can be made from the app
Wallet
Gift
Admin settings
5Safety and admin15%2
  • Report a video or user, block a user, delete own videos and account
  • Admin web dashboard: see users and videos, view reports, remove content, suspend accounts
  • Age check at sign-up (13+ to use, 18+ to earn) and community guidelines screen
  • A reported video appears in the dashboard and can be removed in under a minute
  • A deleted account and its videos are gone from the app
Report
Age check
Admin
6Pilot release and handover25%2
  • Fix all bugs found in milestones 1 to 5
  • Release on Google Play under the Dumo The Fame developer account (closed or open testing)
  • Handover: README, list of all accounts and services, a 1-hour recorded walkthrough of the code
  • 100 pilot creators can install Dumo from Google Play
  • An independent developer reviews the code and confirms the README is enough to run it
  • All passwords and access are confirmed in the client's hands
Handover list

Timeline

Kickoff Monday 12 October 2026. M1 setup (repo, accounts, auth) runs alongside design, because it doesn't depend on visual sign-off. We pause over the December holidays, and each 5-day acceptance window overlaps the start of the next milestone.

PhaseStartEndDemo & acceptance

Monthly running costs (estimate)

Pilot assumptions: 100 creators, about 2,000 viewers, 3,000 videos stored (about 30 s average), 500,000 minutes watched a month, 1,500 OTP SMS a month. Prices are list prices converted at about R18/$. We confirm them with real quotes in Milestone 1.

ItemUSD / monthZAR / monthNotes
Video: encode, store, stream (Mux)$150 – $450R2,700 – R8,100Delivery is the biggest cost. Data Saver and a 720p cap pull it toward the lower end.
API (Cloud Run)$0 – $25R0 – R450Scales to zero, and the free tier covers most of the pilot
Database (Cloud SQL Postgres, small)$30 – $70R540 – R1,260Includes daily backups
Storage + egress (photos, thumbnails)$5 – $20R90 – R360
SMS OTP$40 – $120R720 – R2,160Per-SMS rates to SA numbers vary. Clickatell may be cheaper locally.
Admin dashboard hosting$0 – $10R0 – R180Cloud Run
Crash reporting & monitoring$0 – $10R0 – R180Crashlytics is free, plus Cloud Monitoring
Domain & company email$8 – $20R144 – R360If not already owned
Total per month$233 – $725R4,200 – R13,000

One-off: Google Play developer registration $25 (about R450). An organisation account needs a D-U-N-S number, which is free but can take up to 30 days, so we start it in week 1. Real-money features (PayShap, coin purchases) add payment-provider fees in a later phase.

Risks & mitigations

RiskLevelMitigation
Video streaming costs grow faster than expectedHighCap at 720p, use a low-bitrate default on cellular, preload only 1–2 videos, set budget alerts at 50/80/100%, review the cost dashboard weekly.
OTP SMS delivery or cost problems in SAMediumTest on Vodacom, MTN, Cell C and Telkom in M1. Rate-limit OTP requests. Keep Clickatell as a fallback. Allow a "resend code" after 30 s.
POPIA compliance and data leaving SAMediumData and compute in Johannesburg. Collect only what we need. Sign a data processing agreement with the video provider (s72). Account deletion really deletes. Privacy policy agreed with the client.
Minors' safety (13–17 year olds)HighAge gate at sign-up, earning locked under 18, reporting and blocking everywhere, admin removal in under a minute, community guidelines accepted at sign-up.
Slow performance on low-end AndroidMediumTest on budget devices weekly, use HLS with a small first segment, cache thumbnails, profile in release mode, set a 2 s start budget in QA.
Scope creep from features the prototype shows (PayShap, Subscribe, LIVE, Go Global, cross-posting)HighThese are marked "Coming soon" or hidden in the pilot design and listed as decisions in Questions. Any change needs a written change request with price and time.
Google Play policy for user-generated content appsMediumPolicy requires in-app reporting, blocking, moderation and a published content policy, all built in M5. We complete the data safety form and content rating questionnaire early.
Slow client acceptance holds up payments and the scheduleLowTest scripts sent with every build, 15-min demo calls, a 5-working-day window, and acceptance overlapping the next milestone.
Company accounts not ready (Play, cloud billing, D-U-N-S)MediumAccount checklist in week 1. The client owns every account, and we are invited with access only.

Cadence, quality and Definition of Done

Communication

  • Written update every Monday and Thursday: done, next, blockers
  • 15-minute demo call at the end of each milestone
  • Feature questions go to BP Mhlanga before we guess
  • Code pushed to the company's GitHub at least twice a week

Acceptance

  • The client has 5 working days to test each milestone
  • Bugs found are fixed before payment
  • Payment is released through Fiverr milestones once every "done when" test passes
  • Scope changes are agreed in writing, with price and time, before work starts

Definition of Done

  • Matches the signed-off design
  • Strings are in the ARB file, with no hard-coded text
  • No secrets in code, and CI is green
  • Tested on the device matrix and on throttled 4G
  • README updated, libraries listed with their licences

Test devices

  • Samsung Galaxy A05 (entry level, Android 13/14)
  • Samsung Galaxy A15 (mid-range, our 2 s benchmark)
  • Xiaomi Redmi 12
  • Hisense or Infinix (low-end)
  • One Android 9 device (minimum version)

QA checks per milestone

  • Throttled 4G profile: video start ≤ 2 s on the A15
  • 15-minute swipe, like and comment session with no crashes (Crashlytics)
  • Wallet results match the client's spreadsheet to the cent (M4)
  • Report, then remove in under 60 s, timed (M5)
  • Data use measured with Data Saver on and off (M3)

Final handover checklist

Security & ownership

Dumo The Fame (Pty) Ltd owns everything: code, designs, databases and accounts. Google Play, Google Cloud, Mux, the SMS provider and GitHub are opened in the company's name and paid by the company, and the team only gets access. No passwords, API keys or secrets in the repository: they live in Secret Manager and GitHub Actions secrets. Admin actions are written to an audit log. Only open-source libraries with commercial-friendly licences (MIT, Apache 2.0, BSD) are used.