tani-dahu-pertanian

bySuni Dahu

‎Buatkan sayah aplikasi yang bernama  Tani Dahu ini agar siap untuk ‎google play store ‎ ‎1. Buatkan fitur.Beranda upload Poto setatus vidio berkualitas tinggi degan tombol ( + )  dan fitur Feed buat rekomendasi produk Poto vidio setatus dari aplikasi pertanian dahu komentar dan bagikan.lengkapi pakai Supabest storage gratis Reltime sinkron untuk semua orang ‎ ‎2. Buatkan Fitur marketplace degan unggah produk  Poto vidio berkualitas tinggi dan harga coret.berat produk.nama penjual nomor wa penjual. Semua barang bisa yang di jual bisa dilihat oleh semua peguna aplikasi  Tani Dahu di seluruh dunia.simpan data di Supabest storage  Suprbest Auth dan Poto vidio di Suprbest storage dan ada tombol beli.cat penjual.bagikan produk.chat WA untuk menghubungi penjual.Semua Data Harus sinkron untuk semua orang. ‎ ‎3. Buatkan fitur propil peguna degan tambah foto sampul Poto propil Ambil Poto dari galeri hp.pegikut dan mengikuti dan degan domisili dan alamat yang lengkap dan bagikan propil harus ada dasbor analitik peguna supaya yang melihat produk Poto vidio  pengunjung propil ke deteksi.tetapkan dasbor analitik di atas propil peguna agar tidak mudah di geser degan tombol  (dasbor analitik) fitur propil harus sinkron ke Supabest storage ‎ ‎4. buatkan fitur cat untuk semua peguna aplikasi  pake Supabest Reltime Supabest storage auth .jadi semua orang yang buka aplikasi degan link bisa saling cat. Dengan lengkap data harus sinkron ke Supabest ‎ 5. ‎Buatkan fitur diagnosa AI super  canggih sambungkan ke Gemini API  KEY Gratis.untuk mendeteksi peyakit tanaman dan solusi.dan pengobatan untuk segala jenis tanaman petunjuk degan realtime. tambah tombol cuaca.hujan.angin.panas lokasi harus sinkron real-time dan tombol kalender.hitung modal.scren kode pupuk . budidaya dan panduan lengkap budidaya cara menanam tanaman degan lengkap 6. ‎Buatkan fitur notifikasi sistem agar cat. produk penjualan.poto dan vidio masuk ke sistem notifikasi lalu sambungan ke Supabest 7. ‎Buatkan Peganturan sistem degan tombol bantuan menu seting akun dan buatkan kebijakan privasi degan detail tentang aplikasi Tani Dahu degan lengkap.dan harus ada  logut dan login akun.peguna sambungkan pengaturan akun ke Supabest. 8. ‎· Login & Register pakai Email + Password + Lupa Password ‎· Upload foto/produk jualan/video/propil.cat ke cloud storage (bukan base64 di browser ) ‎· Tombol Lapor Postingan dan Blokir User ‎· Halaman Privacy Policy dan Delete Account ‎· Moderasi konten otomatis. lalu berikan file aab dan apk ‎

No preview

Comments (0)

No comments yet. Be the first!

System Requirements

Page 1 of 26

System Requirements Document for tani-dahu-pertanian

1. Introduction

Tani Dahu is an Indonesian agriculture super-app built for smallholder farmers, home gardeners, and agricultural sellers. It combines a social feed of crop photos, videos, and status updates; a worldwide marketplace for farm produce and inputs; farmer-to-farmer real-time chat; an AI plant doctor powered by the Gemini API; and a set of field tools (weather, planting calendar, cost calculator, fertilizer codes, and cultivation guides).

The product intent is to give farming communities one honest, hand-built field tool that lets them share their work, sell and buy produce across the world, talk to each other in real time, diagnose plant disease, and plan cultivation — all synchronized live through Supabase so that every user sees the same data. The app must be packaged and ready for distribution on the Google Play Store as AAB and APK files.

The audience is smallholder farmers, home gardeners, and agricultural sellers, many on mid-range Android phones, working outdoors in daylight in a rural context. The app must feel like a well-worn pocket notebook for farmers — practical, communal, proud of the work, and slightly rugged.

Page 2 of 26

2. System Overview

Tani Dahu is delivered as a mobile application (Android, packaged as AAB and APK for Google Play Store) with a first-party custom UI. All persistent data, media, real-time synchronization, and authentication are owned by Supabase (Storage, Realtime, Auth). Plant diagnosis is owned by the Gemini API. Seller contact is handed off to WhatsApp as an external destination.

Actors:

  • Human personas (closed set): Pengguna Tani Dahu (Petani/Pengguna Umum), Penjual Produk Pertanian, Pembeli/Pengunjung Produk, Pemilik Profil Pengguna, Pengguna Fitur Diagnosa & Budidaya, Pengguna Pengaturan Akun.
  • Non-persona actors: Supabase (Storage, Realtime, Auth), Gemini API, WhatsApp (external destination), the automated content-moderation process, and the build/signing pipeline that produces AAB/APK.

Accepted behavior: anonymous browsing of Beranda and marketplace; authenticated upload of high-quality photo/video status via the (+) button; a real-time Feed with recommendations, comments, and sharing; a worldwide marketplace with struck-through pricing, product weight, seller name, seller WA number, buy button, seller chat, product sharing, and WhatsApp contact; a user profile with cover photo and profile photo taken from the phone gallery, followers/following, domicile and full address, profile sharing, and a pinned analytics dashboard; real-time chat between all users; Gemini-powered plant diagnosis with solutions and treatment; weather (rain, wind, heat) with real-time location sync; calendar, cost calculator, fertilizer code screen, and complete cultivation guides; system notifications for chat, sales, photos, and videos; system settings with help, account settings, detailed privacy policy, login and logout; email + password login/register with forgot password; cloud storage uploads (never base64 in browser); report post and block user; Privacy Policy and Delete Account pages; automatic content moderation; and delivery of AAB and APK files.

Narrow exclusions: No blue or indigo primary/accent color; no white-first layout; no gradients, glassmorphism, or soft blurred shadows; no rounded-pill buttons; no bouncy or springy micro-interactions, particles, or parallax drift; no pastel, candy, or neon palette; no Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins, or system-ui for headings or body; no grid of identical hover-lift cards; no readable text or control cropped, covered, or run off an edge at 375px, 768px, or 1280px.

Page 3 of 26

2a. Product Interpretation and Delivery Boundary

Tani Dahu is a first-party Android application. The application owns its custom UI, its navigation, and the interaction surfaces through which users share, sell, chat, diagnose, plan, and manage their accounts. Supabase owns persistence, media storage, real-time synchronization, and authentication. Gemini owns plant-disease inference. WhatsApp owns the outbound seller-contact conversation once a user leaves the app.

Anonymous access is available on Beranda, marketplace, Privacy Policy, Login, Register, and Lupa Password. All other destinations require an authenticated session. Application-owned identity is established through self-service email + password registration, with returning verification through login and recovery through forgot password. There is no differentiated permission model beyond the authenticated/unauthenticated boundary and the ownership of one's own profile, listings, and chat participation.

Current delivery covers all features listed in the authoritative requirement thread. There is no future-horizon feature set beyond the current scope; the AAB and APK build artifacts are part of current delivery.

2b. Source Content Inventory

Not applicable — no reference directive declares content_source.

2c. Page Content and Component Coverage

Page 4 of 26

Beranda

  • Information/state: Anonymous-accessible landing surface. Forest-green header band with the wordmark "TANI DAHU" in Alfa Slab One and the tagline "PERTANIAN • PASAR • PETANI" in Oswald all-caps. A 4:5 documentary photograph of a farmer's hands holding harvested produce, ink-bordered. A hazard-stripe ticker of trending produce. After authentication, the (+) upload entry point becomes active.
  • Primary actions: Press the (+) upload button (64×64px solid orange square, 4px ink border, 3px hard offset shadow) to upload a high-quality photo or video status; press "JELAJAHI PASAR" to enter the marketplace.
  • Supporting actions: Navigate to Feed, marketplace, diagnosa AI, Cuaca, Panduan Budidaya, cat, propil pengguna, Notifikasi, Peganturan sistem.
  • Domain entities: Status post (photo/video), trending produce ticker items, authenticated user session.
  • Component responsibilities: Header band, hero photograph frame, upload card with (+) button and "UNGGAH FOTO / VIDEO" label, secondary "JELAJAHI PASAR" button, hazard-stripe ticker, section bands with oversized vector ornaments.
  • States: Loading (ticker and hero media), empty (no trending items — ticker shows a static placeholder row), success (upload stamped with badge-shaped confirmation), error (upload failure with retry), recovery (retry upload or return to Beranda).

Feed

  • Information/state: Real-time feed of recommended products, photos, videos, and status from the Tani Dahu agriculture community. Each item shows author, media, caption, comment count, and share control. A trending-produce ticker runs under the feed header.
  • Primary actions: Comment on a post; share a post; open a post's author profile; open a product referenced in a post.
  • Supporting actions: Report post; block user; navigate to Notifikasi.
  • Domain entities: Feed post (photo/video/status), comment, share event, author profile reference, product reference.
  • Component responsibilities: Feed header band, trending ticker, ruled post rows with ink borders, comment composer, share control, report/block controls.
  • States: Loading (skeleton ruled rows), empty (no posts yet — message with prompt to upload the first status), success (new post appears in real time), error (feed fetch failure with retry), recovery (pull to refresh).

marketplace

  • Information/state: Public catalog of agricultural products from all Tani Dahu users worldwide. Ruled ledger-style rows (not hover-lift cards): thick 3px ink rules between items, left category badge with pictogram, price in Alfa Slab One with original price struck through in muted khaki, weight chip in Oswald all-caps, seller name and WA number in tabular numerals, solid orange "BELI" block, all inside a 4px ink border.
  • Primary actions: Open Detail Produk; press "BELI"; share product; open seller chat; open WhatsApp contact.
  • Supporting actions: Filter/browse by category badge; navigate to Produk Baru (seller only).
  • Domain entities: Product listing (photo, video, price, struck-through price, weight, seller name, seller WA number, category), seller profile reference.
  • Component responsibilities: Marketplace header band, ruled listing rows, category badges, price block with strikethrough, weight chip, WA button, BELI block, hazard-stripe "DISKON"/"HARGA CORE" tags.
  • States: Loading (ruled skeleton rows), empty (no listings — message inviting sellers to post), success (new listing appears in real time), error (catalog fetch failure with retry), recovery (pull to refresh).
Page 5 of 26

Detail Produk

  • Information/state: Full product detail: high-quality photo and video, price with struck-through original, weight, seller name, seller WA number, category badge, description.
  • Primary actions: Press "BELI"; open cat penjual; share product; open WhatsApp chat to seller.
  • Supporting actions: Open seller profile; report listing; block seller.
  • Domain entities: Product listing, seller profile, buy intent, share event, WhatsApp handoff.
  • Component responsibilities: Media frame (ink-bordered), price block, weight chip, seller card with WA number, BELI button, cat penjual button, share button, WA chat button.
  • States: Loading (media and detail skeleton), empty (product removed — message with return to marketplace), success (buy intent recorded, share stamped, WhatsApp opened), error (media or detail fetch failure with retry), recovery (retry or return to marketplace).

Produk Baru

  • Information/state: Focused form for a seller to upload and manage a product listing. Fields: high-quality photo, high-quality video, price, struck-through original price, product weight, seller name, seller WA number, category.
  • Primary actions: Upload photo/video to Supabase Storage; submit listing; edit existing listing.
  • Supporting actions: Cancel; preview media; navigate back to marketplace.
  • Domain entities: Product listing draft, media asset in Supabase Storage, seller identity.
  • Component responsibilities: Media picker with ink-bordered preview, price inputs, weight input, seller name and WA number inputs, category badge selector, submit block with stamp confirmation.
  • States: Loading (media upload progress), empty (blank form), success (listing published with badge-shaped stamp), error (upload or validation failure with field-level messages), recovery (retry upload or correct fields).

propil pengguna

  • Information/state: User profile with cover photo and profile photo taken from the phone gallery, followers count, following count, domicile, full address, and shared profile link. The analytics dashboard is pinned sticky above the profile header and does not scroll away until collapsed.
  • Primary actions: Add cover photo from gallery; add profile photo from gallery; edit domicile and full address; follow/unfollow; share profile; open the "DASBOR ANALITIK" toggle.
  • Supporting actions: Open a follower/following list; open a user's posts and products; report user; block user.
  • Domain entities: Profile (cover photo, profile photo, domicile, full address), follow relationship, shared profile link, profile visit event, content view event.
  • Component responsibilities: Sticky ink-bordered analytics panel with "DASBOR ANALITIK" all-caps toggle, profile header with cover and profile photo, follower/following counters, domicile and address block, share control, gallery of the user's photos and videos.
  • States: Loading (profile and analytics skeleton), empty (no cover/photo yet — prompt to add from gallery), success (photo saved and synced to Supabase Storage), error (gallery permission denied or upload failure with retry), recovery (retry upload or grant permission).
Page 6 of 26

Analytics Profil

  • Information/state: Pinned ink-bordered panel directly above the profile header. Three numbers in Alfa Slab One: pengunjung profil, penonton produk, pengikut baru. Counts up once on entry. Collapses with a hard 180ms snap via the "DASBOR ANALITIK" toggle.
  • Primary actions: Toggle the panel open/collapsed with the "DASBOR ANALITIK" button.
  • Supporting actions: None beyond the toggle.
  • Domain entities: Profile visit event, product view event, new follower event.
  • Component responsibilities: Sticky panel container, three count-up number blocks, "DASBOR ANALITIK" toggle button.
  • States: Loading (count-up animation from zero), empty (zero counts shown truthfully), success (counts displayed), error (analytics fetch failure with retry), recovery (retry fetch).

cat

  • Information/state: Real-time chat between all Tani Dahu users. Any user who opens the app with a link can chat with others. Messages sync through Supabase Realtime.
  • Primary actions: Send a chat message; open a conversation; share a link to a conversation.
  • Supporting actions: Report a message; block a user; navigate to Notifikasi.
  • Domain entities: Conversation, chat message, participant, share link.
  • Component responsibilities: Conversation list, message thread with ink-bordered bubbles, message composer with stamp-on-send, report/block controls.
  • States: Loading (conversation and message skeleton), empty (no conversations — prompt to start one), success (message delivered and stamped), error (send failure with retry), recovery (retry send or reopen conversation).

diagnosa AI

  • Information/state: Gemini-powered plant diagnosis. User submits a plant photo or description; the app returns detected disease, solution, and treatment for any plant type with real-time guidance.
  • Primary actions: Submit plant photo or description; request diagnosis; view solution and treatment.
  • Supporting actions: Save diagnosis; share diagnosis; navigate to Panduan Budidaya.
  • Domain entities: Diagnosis request (photo/description), diagnosis result (disease, solution, treatment), Gemini API response.
  • Component responsibilities: Photo/description input, submit block with stamp confirmation, result panel with disease, solution, and treatment sections, real-time guidance stream.
  • States: Loading (diagnosis in progress with mechanical progress indicator), empty (no diagnosis yet — prompt to submit), success (diagnosis stamped and displayed), error (Gemini API failure with retry), recovery (retry submission or edit input).
Page 7 of 26

Cuaca

  • Information/state: Real-time weather for the user's location: rain, wind, and heat. Location is synchronized in real time.
  • Primary actions: View current rain, wind, and heat conditions; refresh location.
  • Supporting actions: Navigate to Panduan Budidaya for weather-dependent guidance.
  • Domain entities: Location, weather reading (rain, wind, heat).
  • Component responsibilities: Location indicator, three weather readout blocks in Oswald tabular numerals, refresh control.
  • States: Loading (weather fetch in progress), empty (location unavailable — prompt to grant permission), success (readings displayed), error (weather fetch or permission failure with retry), recovery (retry fetch or grant location permission).

Panduan Budidaya

  • Information/state: Field tools: calendar, cost calculator (hitung modal), fertilizer code screen (screen kode pupuk), cultivation (budidaya), and complete planting guides (panduan lengkap cara menanam tanaman).
  • Primary actions: Open calendar; calculate cost (hitung modal); look up fertilizer code; read cultivation guide; read complete planting guide.
  • Supporting actions: Navigate to diagnosa AI or Cuaca for related guidance.
  • Domain entities: Calendar entry, cost calculation input/output, fertilizer code reference, cultivation guide content, planting guide content.
  • Component responsibilities: Calendar block, cost calculator with count-up result, fertilizer code lookup, cultivation guide sections, planting guide sections, section bands with oversized vector ornaments.
  • States: Loading (guide content fetch), empty (no guide content for a selected crop — message), success (content displayed, cost calculated), error (content fetch failure with retry), recovery (retry fetch).

Notifikasi

  • Information/state: System notifications for chat, product sales, photos, and videos, connected to Supabase. Notification dots use burnt orange.
  • Primary actions: Open a notification to its source (chat, product, photo, video); mark as read.
  • Supporting actions: Clear notifications; navigate to the relevant destination.
  • Domain entities: Notification (type: chat/product/photo/video, source reference, read state).
  • Component responsibilities: Notification list with ruled rows, notification dot, source link, mark-as-read control.
  • States: Loading (notification skeleton), empty (no notifications — message), success (notifications listed in real time), error (fetch failure with retry), recovery (retry fetch).
Page 8 of 26

Peganturan sistem

  • Information/state: System settings with help button, account settings menu, and detailed privacy policy about the Tani Dahu app. Login and logout controls. Account settings connected to Supabase.
  • Primary actions: Open help; open account settings; open Privacy Policy; open Delete Account; log out.
  • Supporting actions: Navigate to Login if logged out.
  • Domain entities: Account settings, help content, privacy policy reference, session.
  • Component responsibilities: Settings list with ruled rows, help button, account settings menu, Privacy Policy link, Delete Account link, logout block.
  • States: Loading (settings fetch), empty (not applicable — settings always present), success (settings displayed, logout completed), error (settings fetch or logout failure with retry), recovery (retry fetch or retry logout).

Moderasi

  • Information/state: Interaction destination for reporting a post and blocking a user. Automatic content moderation runs before or at publication.
  • Primary actions: Report a post; block a user; confirm moderation action.
  • Supporting actions: Unblock a user; view moderation status.
  • Domain entities: Report (post reference, reason), block relationship, moderation decision.
  • Component responsibilities: Report form with reason selection, block confirmation block, moderation status display.
  • States: Loading (report submission in progress), empty (no reports or blocks — message), success (report submitted or user blocked with stamp confirmation), error (submission failure with retry), recovery (retry submission).

Privacy Policy

  • Information/state: Detailed privacy policy about the Tani Dahu application. Anonymous-accessible.
  • Primary actions: Read the privacy policy.
  • Supporting actions: Navigate to Delete Account or Peganturan sistem.
  • Domain entities: Privacy policy content.
  • Component responsibilities: Policy content sections with ruled dividers, section bands.
  • States: Loading (policy fetch), empty (not applicable), success (policy displayed), error (fetch failure with retry), recovery (retry fetch).
Page 9 of 26

Delete Account

  • Information/state: Page for requesting account deletion. Requires an authenticated session.
  • Primary actions: Request account deletion; confirm deletion.
  • Supporting actions: Cancel deletion; navigate to Privacy Policy.
  • Domain entities: Deletion request, account, confirmation.
  • Component responsibilities: Deletion explanation, confirmation block with stamp, cancel control.
  • States: Loading (deletion request in progress), empty (not applicable), success (deletion requested with confirmation), error (deletion failure with retry), recovery (retry deletion or cancel).

Login

  • Information/state: Account access with email and password, plus returning verification. Anonymous-accessible.
  • Primary actions: Enter email and password; submit login; navigate to Lupa Password; navigate to Register.
  • Supporting actions: None beyond navigation.
  • Domain entities: Credentials, session.
  • Component responsibilities: Email input, password input, submit block, forgot-password link, register link.
  • States: Loading (login in progress), empty (blank form), success (session established, redirect to Beranda or intended destination), error (invalid credentials or network failure with message), recovery (retry login or use Lupa Password).

Register

  • Information/state: Self-service account creation with email and password. Anonymous-accessible.
  • Primary actions: Enter email and password; submit registration; navigate to Login.
  • Supporting actions: None beyond navigation.
  • Domain entities: New account, credentials.
  • Component responsibilities: Email input, password input, submit block, login link.
  • States: Loading (registration in progress), empty (blank form), success (account created, session established), error (email already used or validation failure with message), recovery (retry registration or use Login).
Page 10 of 26

Lupa Password

  • Information/state: Account access recovery through the forgot-password flow. Anonymous-accessible.
  • Primary actions: Enter email; request password reset; follow reset instructions.
  • Supporting actions: Navigate to Login.
  • Domain entities: Reset request, email.
  • Component responsibilities: Email input, submit block, login link.
  • States: Loading (reset request in progress), empty (blank form), success (reset instructions sent), error (email not found or network failure with message), recovery (retry request or use Login).
Page 11 of 26

3. Functional Requirements

FR-01 — Google Play–ready delivery (explicit) As a Pengguna Pengaturan Akun, I should receive Tani Dahu packaged as AAB and APK files ready for the Google Play Store, so that the app can be distributed and installed on Android devices.

  • Trigger: Build and signing pipeline runs.
  • Observable result: AAB and APK artifacts are produced and delivered.
  • Failure/recovery: Build or signing failure surfaces an error and the pipeline can be re-run.
  • Continuation: Artifacts are submitted to Google Play Store.

FR-02 — Beranda status upload with (+) button (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should upload high-quality photo and video status from Beranda using the (+) button, so that my farming activity is shared with the community.

  • Trigger: Authenticated user presses the (+) button on Beranda.
  • Input: High-quality photo or video selected from the device.
  • Observable result: Media is uploaded to Supabase Storage and the status is published with a badge-shaped stamp confirmation.
  • Failure/recovery: Upload failure shows an error with retry; the user can reselect media.
  • Continuation: The status appears in the Feed and is visible to all users.

FR-03 — Feed recommendations with comments and sharing (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should see a Feed of recommended products, photos, videos, and status from the Tani Dahu agriculture community, and comment on and share posts, so that I can engage with other users' content.

  • Trigger: User opens Feed.
  • Input: Feed content from Supabase, comment text, share action.
  • Observable result: Feed displays recommended content in real time; comments appear on the post; shares are recorded.
  • Failure/recovery: Feed or comment failure shows an error with retry.
  • Continuation: User continues browsing or opens a referenced product or profile.

FR-04 — Real-time synchronization for Beranda and Feed (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should see Beranda and Feed content synchronized in real time for all users using free Supabase Storage, so that everyone sees the same content.

  • Trigger: Any user publishes or updates content.
  • Observable result: All connected users see the update in real time.
  • Failure/recovery: Realtime connection loss shows a reconnecting state and retries.
  • Continuation: Content remains consistent once reconnected.

FR-05 — Marketplace product upload (explicit) As a Penjual Produk Pertanian, I should upload products to the marketplace with high-quality photo and video, struck-through price, product weight, seller name, and seller WA number, so that buyers worldwide can find and purchase my products.

  • Trigger: Seller opens Produk Baru and submits a listing.
  • Input: Photo, video, price, struck-through original price, weight, seller name, seller WA number, category.
  • Observable result: Listing is saved to Supabase Storage with media in Supabase Storage and appears in the marketplace.
  • Failure/recovery: Upload or validation failure shows field-level errors with retry.
  • Continuation: Listing is visible to all Tani Dahu users worldwide.

FR-06 — Worldwide marketplace visibility (explicit) As a Pembeli/Pengunjung Produk, I should see all products sold by all Tani Dahu users worldwide, so that I can discover agricultural products from anywhere.

  • Trigger: User opens marketplace.
  • Observable result: All published listings are visible regardless of location.
  • Failure/recovery: Catalog fetch failure shows an error with retry.
  • Continuation: User opens Detail Produk.

FR-07 — Marketplace data storage and authentication (explicit) As a Penjual Produk Pertanian, I should have my marketplace data stored in Supabase Storage with Supabase Auth and my photos/videos in Supabase Storage, so that my listings are securely persisted and tied to my account.

  • Trigger: Seller submits or edits a listing.
  • Observable result: Data is persisted in Supabase Storage; media is stored in Supabase Storage; the listing is bound to the authenticated seller.
  • Failure/recovery: Storage or auth failure shows an error with retry.
  • Continuation: Listing remains available and editable by the seller.

FR-08 — Buy, seller chat, share, and WhatsApp contact (explicit) As a Pembeli/Pengunjung Produk, I should use the buy button, chat with the seller, share the product, and open WhatsApp chat to contact the seller, so that I can complete a purchase or reach the seller directly.

  • Trigger: Buyer opens Detail Produk and presses BELI, cat penjual, bagikan produk, or chat WA.
  • Observable result: Buy intent is recorded; seller chat opens; share is recorded; WhatsApp opens with the seller's WA number.
  • Failure/recovery: WhatsApp unavailable or chat failure shows an error with retry.
  • Continuation: Buyer continues in the app or in WhatsApp.

FR-09 — Marketplace data synchronization (explicit) As a Pembeli/Pengunjung Produk, I should see marketplace data synchronized for all users, so that listings and prices are consistent worldwide.

  • Trigger: Any seller publishes or updates a listing.
  • Observable result: All connected users see the update in real time.
  • Failure/recovery: Realtime connection loss shows a reconnecting state and retries.
  • Continuation: Listings remain consistent once reconnected.

FR-10 — Profile cover and profile photo from gallery (explicit) As a Pemilik Profil Pengguna, I should add a cover photo and a profile photo taken from my phone gallery, so that my profile represents me.

  • Trigger: User opens propil pengguna and selects a cover or profile photo from the gallery.
  • Observable result: Photo is uploaded to Supabase Storage and displayed in the profile.
  • Failure/recovery: Gallery permission denied or upload failure shows an error with retry.
  • Continuation: Profile displays the updated photo.

FR-11 — Followers and following (explicit) As a Pemilik Profil Pengguna, I should see my followers and following, so that I can track my community relationships.

  • Trigger: User opens propil pengguna.
  • Observable result: Follower and following counts and lists are displayed.
  • Failure/recovery: Fetch failure shows an error with retry.
  • Continuation: User opens a follower/following profile.

FR-12 — Domicile and full address (explicit) As a Pemilik Profil Pengguna, I should set my domicile and full address, so that other users know where I am based.

  • Trigger: User edits domicile and full address in propil pengguna.
  • Observable result: Domicile and full address are saved and displayed.
  • Failure/recovery: Save failure shows an error with retry.
  • Continuation: Profile shows the updated domicile and address.

FR-13 — Profile sharing (explicit) As a Pemilik Profil Pengguna, I should share my profile, so that others can find and view it.

  • Trigger: User presses the share control on propil pengguna.
  • Observable result: A share action is recorded and the profile link is shared.
  • Failure/recovery: Share failure shows an error with retry.
  • Continuation: Recipient opens the shared profile.

FR-14 — Profile analytics dashboard (explicit) As a Pemilik Profil Pengguna, I should see a user analytics dashboard that detects profile visitors and viewers of my product photos and videos, so that I know who is engaging with my content.

  • Trigger: User opens propil pengguna.
  • Observable result: Analytics panel shows pengunjung profil, penonton produk, and pengikut baru counts.
  • Failure/recovery: Analytics fetch failure shows an error with retry.
  • Continuation: User continues viewing the profile.

FR-15 — Pinned analytics dashboard above profile (explicit) As a Pemilik Profil Pengguna, I should have the analytics dashboard fixed above my profile so it does not easily scroll away, with a (dasbor analitik) button, so that I can always see my analytics.

  • Trigger: User scrolls the profile.
  • Observable result: The analytics panel remains pinned above the profile header until collapsed via the "DASBOR ANALITIK" button.
  • Failure/recovery: Toggle failure leaves the panel in its current state.
  • Continuation: User collapses or expands the panel as needed.

FR-16 — Profile synchronization to Supabase Storage (explicit) As a Pemilik Profil Pengguna, I should have my profile synchronized to Supabase Storage, so that my profile data is consistent across sessions and devices.

  • Trigger: User updates profile data.
  • Observable result: Profile data is persisted in Supabase Storage and reflected on reload.
  • Failure/recovery: Sync failure shows an error with retry.
  • Continuation: Profile remains consistent once synced.

FR-17 — Real-time chat between all users (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should chat with all other users who open the app with a link, using Supabase Realtime, Supabase Storage, and Supabase Auth, so that we can communicate directly.

  • Trigger: User opens cat and sends a message.
  • Observable result: Message is delivered in real time to the recipient and stamped on send.
  • Failure/recovery: Send failure shows an error with retry.
  • Continuation: Conversation continues in real time.

FR-18 — Chat data synchronization to Supabase (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should have my chat data synchronized to Supabase, so that conversations are consistent for all participants.

  • Trigger: Any participant sends or updates a message.
  • Observable result: All participants see the update in real time.
  • Failure/recovery: Realtime connection loss shows a reconnecting state and retries.
  • Continuation: Conversation remains consistent once reconnected.

FR-19 — Gemini-powered plant diagnosis (explicit) As a Pengguna Fitur Diagnosa & Budidaya, I should use a super-advanced AI diagnosis connected to the free Gemini API KEY to detect plant disease, solutions, and treatment for any plant type with real-time guidance, so that I can treat my plants correctly.

  • Trigger: User submits a plant photo or description in diagnosa AI.
  • Observable result: Diagnosis result shows detected disease, solution, and treatment with real-time guidance.
  • Failure/recovery: Gemini API failure shows an error with retry.
  • Continuation: User applies the treatment or saves the diagnosis.

FR-20 — Weather button with real-time location sync (explicit) As a Pengguna Fitur Diagnosa & Budidaya, I should use a weather button showing rain, wind, and heat with real-time synchronized location, so that I can plan field work around current conditions.

  • Trigger: User opens Cuaca.
  • Observable result: Rain, wind, and heat readings are displayed for the current location.
  • Failure/recovery: Location permission denied or weather fetch failure shows an error with retry.
  • Continuation: User refreshes or navigates to Panduan Budidaya.

FR-21 — Calendar, cost calculator, fertilizer code, and cultivation guides (explicit) As a Pengguna Fitur Diagnosa & Budidaya, I should use the calendar button, cost calculator (hitung modal), fertilizer code screen (screen kode pupuk), cultivation (budidaya), and complete planting guides (panduan lengkap cara menanam tanaman), so that I can plan and manage my cultivation.

  • Trigger: User opens Panduan Budidaya and selects a tool.
  • Observable result: Calendar, cost calculation result, fertilizer code, cultivation guide, and planting guide are displayed.
  • Failure/recovery: Content fetch failure shows an error with retry.
  • Continuation: User applies the guide or returns to diagnosa AI.

FR-22 — System notifications (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should receive system notifications for chat, product sales, photos, and videos, connected to Supabase, so that I stay informed about activity relevant to me.

  • Trigger: A chat message, product sale, photo, or video event occurs.
  • Observable result: A notification appears in Notifikasi with a burnt-orange dot.
  • Failure/recovery: Notification fetch failure shows an error with retry.
  • Continuation: User opens the notification to its source.

FR-23 — System settings with help, account settings, and privacy policy (explicit) As a Pengguna Pengaturan Akun, I should use system settings with a help button, account settings menu, and a detailed privacy policy about the Tani Dahu app, so that I can manage my account and understand how my data is handled.

  • Trigger: User opens Peganturan sistem.
  • Observable result: Help, account settings, and privacy policy are accessible.
  • Failure/recovery: Settings fetch failure shows an error with retry.
  • Continuation: User opens the selected setting.

FR-24 — Login and logout (explicit) As a Pengguna Pengaturan Akun, I should log in and log out of my account, with account settings connected to Supabase, so that my account is secure and my settings are persisted.

  • Trigger: User submits login credentials or presses logout.
  • Observable result: Session is established or terminated; account settings are persisted in Supabase.
  • Failure/recovery: Login or logout failure shows an error with retry.
  • Continuation: User continues in the app or returns to Login.

FR-25 — Email + password login, register, and forgot password (explicit) As a Pengguna Pengaturan Akun, I should log in and register with email + password and recover access through forgot password, so that I can access my account and recover it if I forget my password.

  • Trigger: User submits login, registration, or password reset request.
  • Observable result: Session is established, account is created, or reset instructions are sent.
  • Failure/recovery: Invalid credentials, duplicate email, or network failure shows an error with retry.
  • Continuation: User proceeds to the intended destination or retries.

FR-26 — Cloud storage uploads (not base64 in browser) (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should have my photos, sale products, videos, profile media, and chat media uploaded to cloud storage (not base64 in the browser), so that media is stored efficiently and reliably.

  • Trigger: User uploads any media.
  • Observable result: Media is uploaded to Supabase Storage and referenced by URL.
  • Failure/recovery: Upload failure shows an error with retry.
  • Continuation: Media is displayed from cloud storage.

FR-27 — Report post and block user (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should report a post and block a user, so that I can protect myself from unwanted content and interactions.

  • Trigger: User presses report on a post or block on a user.
  • Observable result: Report is submitted; the blocked user's content is hidden from the reporter.
  • Failure/recovery: Submission failure shows an error with retry.
  • Continuation: User continues browsing with the block in effect.

FR-28 — Privacy Policy and Delete Account pages (explicit) As a Pengguna Pengaturan Akun, I should access a Privacy Policy page and a Delete Account page, so that I can understand the app's data practices and request deletion of my account.

  • Trigger: User opens Privacy Policy or Delete Account.
  • Observable result: Privacy Policy content is displayed; Delete Account request is submitted.
  • Failure/recovery: Fetch or deletion failure shows an error with retry.
  • Continuation: User returns to Peganturan sistem.

FR-29 — Automatic content moderation (explicit) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should have content automatically moderated before or at publication, so that the community is protected from harmful content.

  • Trigger: User publishes a post, product, or chat message.
  • Observable result: Content is screened automatically; violating content is blocked or flagged.
  • Failure/recovery: Moderation service failure surfaces an error and the content is held for retry.
  • Continuation: Compliant content is published; violating content is not.

FR-30 — Supabase Auth for register, login, forgot password, and returning verification (required_inference) As a Pengguna Pengaturan Akun, I should have my registration, login, forgot-password, and returning verification handled by Supabase Auth, so that my identity is securely established and resumed.

  • Trigger: User registers, logs in, requests a password reset, or returns to the app.
  • Observable result: Supabase Auth establishes or restores the session.
  • Failure/recovery: Auth failure shows an error with retry.
  • Continuation: User proceeds to the intended destination.

FR-31 — Supabase Storage for all media (required_inference) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should have all photos, videos, products, profile media, and chat media stored in Supabase Storage, so that media is available to all users and never embedded as base64 in the browser.

  • Trigger: Any media upload.
  • Observable result: Media is stored in Supabase Storage and served by URL.
  • Failure/recovery: Storage failure shows an error with retry.
  • Continuation: Media is displayed from Supabase Storage.

FR-32 — Supabase Realtime for feed, marketplace, profile, chat, weather, and notifications (required_inference) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should have Feed, marketplace, profile, chat, weather, and notifications synchronized through Supabase Realtime, so that all users see the same state.

  • Trigger: Any relevant data change.
  • Observable result: All connected users see the update in real time.
  • Failure/recovery: Realtime connection loss shows a reconnecting state and retries.
  • Continuation: State remains consistent once reconnected.

FR-33 — Gemini API provisioning for plant diagnosis (required_inference) As a Pengguna Fitur Diagnosa & Budidaya, I should have the Gemini API provisioned for plant diagnosis, so that the diagnosa AI feature can return disease, solution, and treatment.

  • Trigger: User submits a diagnosis request.
  • Observable result: Gemini API returns a diagnosis response.
  • Failure/recovery: API failure shows an error with retry.
  • Continuation: Diagnosis is displayed to the user.

FR-34 — Gallery and location permissions (required_inference) As a Pemilik Profil Pengguna, I should grant gallery and location permissions for profile media and weather, so that I can add photos from my gallery and receive location-based weather.

  • Trigger: User selects a gallery photo or opens Cuaca.
  • Observable result: Permission is requested and, if granted, the action proceeds.
  • Failure/recovery: Permission denied shows an explanatory message with a path to settings.
  • Continuation: User retries the action after granting permission.

FR-35 — Automatic moderation before or at publication (required_inference) As a Pengguna Tani Dahu (Petani/Pengguna Umum), I should have automatic content moderation run before or at publication, so that harmful content is caught before it reaches the community.

  • Trigger: User publishes content.
  • Observable result: Content is screened; violating content is blocked or flagged.
  • Failure/recovery: Moderation failure holds the content and surfaces an error with retry.
  • Continuation: Compliant content is published.

FR-36 — WhatsApp as external destination for seller contact (required_inference) As a Pembeli/Pengunjung Produk, I should be handed off to WhatsApp to contact the seller, so that I can reach the seller directly outside the app.

  • Trigger: User presses the chat WA button on Detail Produk.
  • Observable result: WhatsApp opens with the seller's WA number.
  • Failure/recovery: WhatsApp unavailable shows an error with retry.
  • Continuation: User continues the conversation in WhatsApp.

FR-37 — Build signing and packaging for AAB/APK (required_inference) As a Pengguna Pengaturan Akun, I should have the app signed and packaged as AAB and APK for the Google Play Store, so that the app can be published and installed.

  • Trigger: Build pipeline runs.
  • Observable result: Signed AAB and APK artifacts are produced.
  • Failure/recovery: Signing failure surfaces an error and the pipeline can be re-run.
  • Continuation: Artifacts are submitted to Google Play Store.
Page 12 of 26

4. User Personas

Pengguna Tani Dahu (Petani/Pengguna Umum)

A farmer or general user who opens Tani Dahu through a link and wants to share farming activity with the community. They upload high-quality photo and video status through the (+) button on Beranda, browse the Feed for recommended products and status from the Tani Dahu agriculture community, comment on and share posts, and use the cat feature to talk with all other users in real time. They follow and are followed by other users. Their success is that their content and chats are synchronized in real time to Supabase and visible to everyone. Their work is distinct because they are the primary content creator and community participant — the person whose daily activity feeds the social layer of the app.

Penjual Produk Pertanian

A user who sells agricultural products. They upload products to the marketplace with high-quality photo and video, struck-through price, product weight, seller name, and seller WA number, and store the data in Supabase Storage and Supabase Auth with media in Supabase Storage. They manage their listings, share products, and receive buyers through the buy button, seller chat, and WhatsApp contact. Their success is that their products are visible to all Tani Dahu users worldwide with data synchronized for everyone. Their work is distinct because they own listings and are responsible for accurate pricing, weight, and contact information, and they must respond to buyer inquiries.

Page 13 of 26

Pembeli/Pengunjung Produk

A user who browses the marketplace to see products sold by all Tani Dahu users worldwide, then contacts sellers through the buy button, seller chat, share product, or WhatsApp chat. They also view seller profiles and product photos/videos, which registers their visit on the seller's analytics dashboard. Their success is finding the agricultural product they want and successfully contacting the seller. Their work is distinct because they are the demand side of the marketplace — they evaluate listings, compare prices and weights, and initiate contact with sellers.

Pemilik Profil Pengguna

A user who manages their profile by adding a cover photo and profile photo from the phone gallery, completing domicile and full address, and sharing their profile. They monitor the user analytics dashboard pinned above the profile so it does not easily scroll away, to see profile visitors and viewers of their product photos and videos. Their success is a complete profile synchronized to Supabase Storage with detected visit statistics. Their work is distinct because they are the subject of the profile — they curate their identity and interpret the analytics that describe how others engage with their content.

Page 14 of 26

Pengguna Fitur Diagnosa & Budidaya

A user who uses the AI diagnosis to detect plant disease with solutions and treatment for any plant type with real-time guidance, plus the weather button (rain, wind, heat) with real-time location sync, the calendar button, cost calculator (hitung modal), fertilizer code screen (screen kode pupuk), and complete cultivation guides for how to plant. Their success is obtaining a diagnosis, treatment recommendation, and cultivation guide they can apply directly to their plants. Their work is distinct because they are the field practitioner — they bring plant problems and cultivation plans to the app and act on the guidance it returns.

Pengguna Pengaturan Akun

A user who manages their account through system settings: account settings menu, help button, privacy policy, Privacy Policy and Delete Account pages, and login and logout connected to Supabase. They also use the report post and block user buttons to keep their interactions safe. Their success is a secure and controlled account with settings data synchronized to Supabase. Their work is distinct because they are the account steward — they handle access, recovery, privacy, and safety controls rather than content or commerce.

5. Core User Flows

Page 15 of 26

Flow 1 — Anonymous browsing and first-use identity establishment

  1. A new user opens Tani Dahu through a link and lands on Beranda anonymously. The forest-green header band shows the wordmark "TANI DAHU" and the tagline "PERTANIAN • PASAR • PETANI"; the hero photograph and hazard-stripe ticker of trending produce are visible.
  2. The user presses "JELAJAHI PASAR" and browses the marketplace anonymously, seeing ruled ledger-style listings with struck-through prices, weight chips, seller names, and WA numbers.
  3. The user opens Detail Produk to view a listing. The buy, cat penjual, share, and chat WA controls are visible; pressing any of them prompts the user to authenticate.
  4. The user is taken to Register and creates an account with email and password. Supabase Auth creates the account and establishes a session.
  5. If the user already has an account, they go to Login, enter email and password, and Supabase Auth verifies the session. If they have forgotten the password, they go to Lupa Password, enter their email, and receive reset instructions.
  6. On success, the user is returned to the destination they intended (Detail Produk, marketplace, or Beranda) with an authenticated session.
  7. Failure/recovery: Invalid credentials, duplicate email, or network failure shows an error message with retry; the user can switch between Login, Register, and Lupa Password.
  8. Continuation: The user proceeds to the intended action with a verified session.

Flow 2 — Uploading a status from Beranda

  1. An authenticated Pengguna Tani Dahu (Petani/Pengguna Umum) opens Beranda.
  2. The user presses the (+) button — a 64×64px solid orange square with a 4px ink border and 3px hard offset shadow that presses down 3px on tap.
  3. The user selects a high-quality photo or video from the device.
  4. The media uploads to Supabase Storage (never base64 in the browser). A badge-shaped stamp confirmation appears on success.
  5. The status is published and appears in the Feed in real time for all users.
  6. Failure/recovery: Upload failure shows an error with retry; the user can reselect media.
  7. Continuation: The user browses the Feed or uploads another status.
Page 16 of 26

Flow 3 — Browsing the Feed, commenting, and sharing

  1. An authenticated Pengguna Tani Dahu (Petani/Pengguna Umum) opens Feed.
  2. The Feed displays recommended products, photos, videos, and status from the Tani Dahu agriculture community in real time. A trending-produce ticker runs under the feed header.
  3. The user opens a post, reads it, and writes a comment. The comment appears on the post.
  4. The user shares the post. The share is recorded.
  5. Failure/recovery: Feed or comment failure shows an error with retry; the user can pull to refresh.
  6. Continuation: The user opens the author's profile or a referenced product.

Flow 4 — Selling a product on the marketplace

  1. An authenticated Penjual Produk Pertanian opens Produk Baru.
  2. The seller uploads a high-quality photo and video, and enters the price, struck-through original price, product weight, seller name, seller WA number, and category.
  3. The seller submits the listing. Media uploads to Supabase Storage; listing data is saved to Supabase Storage with Supabase Auth binding it to the seller. A badge-shaped stamp confirms publication.
  4. The listing appears in the marketplace in real time and is visible to all Tani Dahu users worldwide.
  5. Failure/recovery: Upload or validation failure shows field-level errors with retry.
  6. Continuation: The seller shares the product or waits for buyer inquiries.

Flow 5 — Buying and contacting a seller

  1. A Pembeli/Pengunjung Produk opens the marketplace and browses ruled ledger-style listings.
  2. The buyer opens Detail Produk to view the full product: high-quality photo and video, price with struck-through original, weight, seller name, seller WA number, and category.
  3. The buyer presses "BELI" to record a buy intent. A stamp confirmation appears.
  4. The buyer presses "cat penjual" to open a real-time chat with the seller, or presses "chat WA" to open WhatsApp with the seller's WA number.
  5. The buyer presses "bagikan produk" to share the product.
  6. Failure/recovery: WhatsApp unavailable or chat failure shows an error with retry.
  7. Continuation: The buyer continues in the app or in WhatsApp.
Page 17 of 26

Flow 6 — Managing the profile and reading analytics

  1. An authenticated Pemilik Profil Pengguna opens propil pengguna.
  2. The analytics dashboard is pinned sticky above the profile header. The user presses the "DASBOR ANALITIK" toggle to expand or collapse it. The three numbers (pengunjung profil, penonton produk, pengikut baru) count up once in Alfa Slab One and the panel collapses with a hard 180ms snap.
  3. The user adds a cover photo and profile photo from the phone gallery. The photos upload to Supabase Storage and display in the profile.
  4. The user edits domicile and full address. The data saves and syncs to Supabase Storage.
  5. The user views followers and following, and follows or unfollows other users.
  6. The user presses share to share the profile.
  7. Failure/recovery: Gallery permission denied or upload failure shows an error with retry; the user can grant permission or reselect media.
  8. Continuation: The user continues viewing the profile or opens a follower's profile.

Flow 7 — Real-time chat with other users

  1. An authenticated Pengguna Tani Dahu (Petani/Pengguna Umum) opens cat.
  2. The user opens a conversation or starts a new one with another user who opened the app with a link.
  3. The user types a message and sends it. The message is delivered in real time through Supabase Realtime and stamped on send.
  4. The recipient sees the message in real time and replies.
  5. Failure/recovery: Send failure shows an error with retry; realtime connection loss shows a reconnecting state.
  6. Continuation: The conversation continues in real time.

Flow 8 — Diagnosing plant disease with AI

  1. An authenticated Pengguna Fitur Diagnosa & Budidaya opens diagnosa AI.
  2. The user submits a plant photo or description.
  3. The app sends the request to the Gemini API. A mechanical progress indicator shows the diagnosis in progress.
  4. The result panel displays the detected disease, solution, and treatment for the plant type, with real-time guidance. A badge-shaped stamp confirms completion.
  5. Failure/recovery: Gemini API failure shows an error with retry; the user can edit the input and resubmit.
  6. Continuation: The user saves or shares the diagnosis, or navigates to Panduan Budidaya.
Page 18 of 26

Flow 9 — Checking weather and using field tools

  1. An authenticated Pengguna Fitur Diagnosa & Budidaya opens Cuaca.
  2. The app requests location permission and reads the current location. Rain, wind, and heat readings are displayed in Oswald tabular numerals.
  3. The user navigates to Panduan Budidaya and opens the calendar, cost calculator (hitung modal), fertilizer code screen (screen kode pupuk), cultivation (budidaya), or complete planting guide.
  4. The cost calculator result counts up once on entry.
  5. Failure/recovery: Location permission denied or weather fetch failure shows an error with retry; content fetch failure shows an error with retry.
  6. Continuation: The user applies the guide or returns to diagnosa AI.

Flow 10 — Receiving and acting on notifications

  1. An authenticated Pengguna Tani Dahu (Petani/Pengguna Umum) receives a notification for a chat message, product sale, photo, or video.
  2. The notification appears in Notifikasi with a burnt-orange dot.
  3. The user opens the notification to its source (chat, product, photo, or video).
  4. The user marks the notification as read.
  5. Failure/recovery: Notification fetch failure shows an error with retry.
  6. Continuation: The user continues in the source destination.

Flow 11 — Reporting a post and blocking a user

  1. An authenticated Pengguna Tani Dahu (Petani/Pengguna Umum) sees a post or user they want to report or block.
  2. The user opens Moderasi and selects report post or block user.
  3. The user selects a reason and confirms. A stamp confirmation appears.
  4. The report is submitted; the blocked user's content is hidden from the reporter.
  5. Failure/recovery: Submission failure shows an error with retry.
  6. Continuation: The user continues browsing with the block in effect.
Page 19 of 26

Flow 12 — Managing account settings, privacy, and deletion

  1. An authenticated Pengguna Pengaturan Akun opens Peganturan sistem.
  2. The user opens the help button, account settings menu, or the detailed privacy policy about the Tani Dahu app.
  3. The user opens Privacy Policy to read the detailed policy, or Delete Account to request account deletion.
  4. The user presses logout. The session is terminated and the user returns to Login.
  5. Failure/recovery: Settings fetch, deletion, or logout failure shows an error with retry.
  6. Continuation: The user logs back in or continues in the app.
Page 20 of 26

6. Visuals Colors and Theme

Muse: Aaron Draplin. Headline: Tani Dahu as a well-worn pocket notebook for farmers — bold, honest, hand-built field-tool design.

Light mode palette (exact hex by role):

  • Background (kraft-paper ground): #EDE4D3
  • Surface (field-notes card): #F7F1E4
  • Text (ink black): #1C1A17
  • Primary (forest green — header bands, badge fills, (+) upload button, active nav): #2E5B3C
  • Accent (burnt orange — BELI button, AI-diagnosis CTA, notification dots, strikethrough price tag, hazard-stripe rule): #E4572E
  • Muted (khaki — secondary metadata, timestamps, captions, hairline rules): #8C7A5B
  • Secondary badge colors (permitted only as badge fills, never as large fields): mustard #D9A227, denim blue #3A5A78

Contrast: #1C1A17 on #EDE4D3 and on #F7F1E4 both exceed 12:1. White type on #2E5B3C and on #E4572E exceeds 4.5:1 at body size.

Typography:

  • Headings: Alfa Slab One — wordmark, section headers, marketplace prices, AI screen title. Heavy slab, all-caps where it is a label or badge, tight tracking (-0.01em).
  • Body and micro-labels: Oswald — 500/600 for all-caps micro-labels, tabular field data, prices in rupiah, weather readouts, and button labels; 400 at 16–17px with 1.55 line-height for body copy. Never set a paragraph in Alfa Slab One.
  • Type scale (1.333 modular): 56 / 42 / 32 / 24 / 18 / 16. Display headline clamp(40px, 9vw, 96px); section header clamp(26px, 5vw, 42px); card title 20px; body 16px mobile → 17px desktop; micro-label 12px with 0.14em letter-spacing, all-caps.

Shape language: Chunky and hand-built. 4px ink borders on cards and buttons; 12px radii (not pill, not square — like a stamped tin sign); hard 6px offset shadows in ink black instead of soft blurs; thick 3px horizontal rules as section dividers; badge shapes (circle, shield, rounded rectangle with a notched corner) for statuses and categories; a repeating diagonal hazard-stripe strip in accent orange and ink for the marketplace's "DISKON" and "HARGA CORE" price tags. Buttons are solid blocks with a 2px ink outline and a 3px downward offset that snaps flat on press.

Spacing rhythm: Mobile-first single column at 375px with 16px gutters; at 768px a 6-column grid with the marketplace becoming 2-up cards; at 1280px a 12-column grid with a fixed left rail (Beranda, Feed, Marketplace, Diagnosa AI, Cuaca, Kalender, Cat, Profil) and content in columns 3–12, max 1180px.

Imagery style: Thick-line vector iconography drawn on a 24px grid with 2.5px strokes — hoes, watering cans, chili, rice stalks, rain cloud, sun, wind, fertilizer sack, tractor, weighing scale — used as both icons and as oversized section ornaments bled off the edge. Photography is documentary and warm: real farmers' hands, soil, harvest crates, market stalls, shot in daylight with a slight film grain, always in 4:5 or 16:9 crops with a 4px ink border. User-uploaded photos and videos from Supabase Storage are displayed in the same ink-bordered frames so community content and studio graphics share one language. Halftone dot texture is allowed on badge fills and the header band.

Forbidden: No blue or indigo primary/accent; no white-first background; no soft gradient blobs, glassmorphism, or frosted panels; no grid of identical hover-lift cards; no Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins, or system-ui for headings or body; no rounded-pill buttons; no soft blurred shadows; no bouncy or springy micro-interactions, particles, or parallax drift; no pastel, candy, or neon palette; no photographic hero without an ink border; no readable text or control cropped, covered, or run off an edge at 375px, 768px, or 1280px.

Page 21 of 26

7. Signature Design Concept

The public entry (Beranda) is a tall poster, not a centred SaaS hero. The top 30% is a full-bleed forest-green (#2E5B3C) band with a 3px burnt-orange (#E4572E) rule at its base. Inside it, left-aligned, the wordmark "TANI DAHU" is set in Alfa Slab One at clamp(40px, 9vw, 96px) in kraft cream, stacked over the Oswald all-caps tagline "PERTANIAN • PASAR • PETANI" at 12px with 0.14em letter-spacing.

Below the band, the dominant element is a 4:5 documentary photograph of a farmer's hands holding harvested produce, ink-bordered, bleeding off the right edge at 375px and sitting in columns 4–8 at 1280px. Overlapping its bottom-left corner is a solid kraft card with a 4px ink border and hard offset shadow containing the primary action: a solid orange (+) button at 64×64px with the label "UNGGAH FOTO / VIDEO" in Oswald 600 all-caps, plus a secondary ink-outlined "JELAJAHI PASAR" button.

A hazard-stripe ticker of trending produce ("CABAI MERAH • PUPUK UREA • BIBIT PADI • KOPI ARABIKA") runs full-bleed across the bottom edge of the hero, continuously scrolling and crossing the viewport edge by design. Under prefers-reduced-motion, the ticker stops and wraps into whole readable rows. No gradient, no blob, no centred stack, no blue button.

Page 22 of 26

8. Interaction Model & Motion Direction

Interaction Model: Static Motion Tempo: restrained Hero Dimensionality: flat

Landing Hero Motion Brief

  • Focal subject: The 4:5 documentary photograph of a farmer's hands holding harvested produce, ink-bordered, bleeding off the right edge at 375px and sitting in columns 4–8 at 1280px.
  • Input → transformation → outcome thesis: As the user scrolls or the page loads, the hero photograph settles into place with a 12px slide-up and snap; the hazard-stripe ticker scrolls continuously across the bottom edge; the (+) button presses down 3px and stamps when tapped. The outcome is a composed, tool-like first frame that reads as a working field notebook, not a marketing page.
  • Motion vocabulary: Sturdy and mechanical — 140–200ms linear/ease-out transitions, no bounce, no float. Snap-in reveals where sections slide up 12px and settle. The (+) upload button presses down 3px and stamps. Hazard stripes on a discounted price tick one step every 2s. Numbers in the analytics dashboard and the cost calculator count up once on entry. Marquees scroll continuously and stop under prefers-reduced-motion, where items wrap into readable rows. Nothing decorative moves without a reason.
  • Composed first frame: Forest-green header band with the wordmark and tagline; the ink-bordered documentary photograph bleeding off the right edge; the kraft card with the orange (+) button and the ink-outlined "JELAJAHI PASAR" button overlapping the photograph's bottom-left corner; the hazard-stripe ticker running full-bleed across the bottom edge.
  • Reduced-motion state: The ticker stops and wraps into whole readable rows; snap-in reveals become instant; count-ups display their final values immediately; the (+) button still presses down 3px on tap but without the stamp animation.
Page 23 of 26

9. Non-Functional Requirements

NFR-01 — Google Play Store readiness (explicit) The application must be packaged and signed as AAB and APK files ready for submission to the Google Play Store. Rationale: the user explicitly requires the app to be ready for Google Play Store and to receive AAB and APK files.

NFR-02 — Cloud storage, not base64 (explicit) All photo, product, video, profile, and chat media uploads must go to cloud storage (Supabase Storage), never as base64 in the browser. Rationale: the user explicitly prohibits base64 in-browser storage.

NFR-03 — Worldwide marketplace visibility (explicit) All products sold in the marketplace must be visible to all Tani Dahu users worldwide. Rationale: the user explicitly requires worldwide visibility.

NFR-04 — Link-based chat access (explicit) All users who open the app with a link must be able to chat with each other. Rationale: the user explicitly requires link-based chat access.

NFR-05 — Pinned analytics dashboard (explicit) The analytics dashboard must be fixed above the user profile so it does not easily scroll away, with a (dasbor analitik) button. Rationale: the user explicitly requires the pinned dashboard.

NFR-06 — Gallery-sourced profile media (explicit) Cover photo and profile photo must be taken from the phone gallery. Rationale: the user explicitly requires gallery sourcing.

NFR-07 — Gemini API KEY (free tier) (explicit) The AI diagnosis must be connected to the free Gemini API KEY. Rationale: the user explicitly requires the free Gemini API KEY.

NFR-08 — Supabase data layer (explicit) Data must be stored and synchronized using Supabase Storage, Supabase Realtime, and Supabase Auth. Rationale: the user explicitly requires Supabase for storage, real-time sync, and authentication.

NFR-09 — Login and logout required (explicit) The application must provide login and logout for user accounts. Rationale: the user explicitly requires login and logout.

NFR-10 — Privacy Policy and Delete Account pages required (explicit) The application must provide a Privacy Policy page and a Delete Account page. Rationale: the user explicitly requires both pages.

NFR-11 — Report and block controls required (explicit) The application must provide a report post button and a block user button. Rationale: the user explicitly requires both controls.

NFR-12 — Automatic content moderation required (explicit) The application must provide automatic content moderation. Rationale: the user explicitly requires automatic moderation.

NFR-13 — Real-time synchronization (explicit) Feed, marketplace, profile, chat, weather, and notification data must be synchronized in real time for all users. Rationale: the user repeatedly requires real-time synchronization for all users.

NFR-14 — Readable text and controls at all viewports (explicit, from creative direction) Headlines, wordmarks, labels, numbers, card text, and controls must stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit. No other element may cover any part of them. Moving and scrollable content may cross the viewport or container edge by design, judged by whether it actually moves or scrolls and whether every item becomes fully readable as it passes. Under prefers-reduced-motion, moving content stops and shows whole items.

NFR-15 — No blue/indigo, no white-first layout (explicit, from creative direction) No blue or indigo primary/accent anywhere; no white-first background; no soft gradient blobs, glassmorphism, or frosted panels. The generic indigo/blue-on-white SaaS template is forbidden.

NFR-16 — Font restriction (explicit, from creative direction) Alfa Slab One and Oswald only for headings and body. No Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins, or system-ui.

NFR-17 — Shape and motion restriction (explicit, from creative direction) No rounded-pill buttons; no soft blurred shadows (corners are 12px, borders are 4px ink, shadows are hard 6px offsets); no bouncy or springy micro-interactions, particles, or parallax drift; motion is mechanical and purposeful.

Page 24 of 26

10. Tech Stack

  • Mobile application: Android app packaged as AAB and APK for Google Play Store. (explicit)
  • Backend and data: Supabase Storage (media and data), Supabase Realtime (real-time synchronization), Supabase Auth (registration, login, forgot password, returning verification). (explicit)
  • AI diagnosis: Gemini API with free API KEY. (explicit)
  • External contact: WhatsApp as the external destination for seller contact. (explicit)
  • Content moderation: Automatic content moderation before or at publication. (explicit)
  • Build and signing: Build signing and packaging pipeline producing AAB and APK artifacts. (required_inference)
Page 25 of 26

11. Assumptions and Constraints

Assumptions:

  • The application is delivered as a first-party Android app; no iOS or web-only delivery is required by the source. (required_inference)
  • Supabase free-tier Storage is used for media and data, as explicitly requested. (explicit)
  • The Gemini API free-tier KEY is used for plant diagnosis, as explicitly requested. (explicit)
  • WhatsApp is available on the user's device for seller contact; if unavailable, the app surfaces an error with retry. (required_inference)
  • Gallery and location permissions are requested at the point of use (profile media and weather). (required_inference)
  • Application-owned identity is established through self-service email + password registration, with returning verification through login and recovery through forgot password. (required_inference)
  • Anonymous access is available on Beranda, marketplace, Privacy Policy, Login, Register, and Lupa Password; all other destinations require an authenticated session. (required_inference)
  • There is no differentiated permission model beyond the authenticated/unauthenticated boundary and ownership of one's own profile, listings, and chat participation. (required_inference)

Constraints:

  • The app must be ready for Google Play Store and delivered as AAB and APK files. (explicit)
  • Uploads must go to cloud storage, not base64 in the browser. (explicit)
  • All marketplace products must be visible to all Tani Dahu users worldwide. (explicit)
  • All users who open the app with a link can chat with each other. (explicit)
  • The analytics dashboard must be pinned above the profile and not easily scrolled away. (explicit)
  • Cover and profile photos must be taken from the phone gallery. (explicit)
  • AI diagnosis must connect to the free Gemini API KEY. (explicit)
  • Data must be stored and synchronized using Supabase Storage, Supabase Realtime, and Supabase Auth. (explicit)
  • Login and logout must be present. (explicit)
  • Privacy Policy and Delete Account pages must be present. (explicit)
  • Report post and block user buttons must be present. (explicit)
  • Automatic content moderation must be present. (explicit)
  • No blue or indigo primary/accent; no white-first layout; no gradients, glassmorphism, or soft blurred shadows; no rounded-pill buttons; no bouncy or springy micro-interactions, particles, or parallax drift; no pastel, candy, or neon palette; no Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins, or system-ui for headings or body; no grid of identical hover-lift cards; no readable text or control cropped, covered, or run off an edge at 375px, 768px, or 1280px. (explicit, from creative direction)
Page 26 of 26

12. Glossary

  • Tani Dahu: The name of the application — an Indonesian agriculture super-app for farmers, gardeners, and agricultural sellers.
  • Beranda: The home/landing surface of the app, anonymously accessible, with the (+) upload entry point after authentication.
  • Feed: The real-time stream of recommended products, photos, videos, and status from the Tani Dahu community, with comments and sharing.
  • Marketplace: The public catalog of agricultural products from all Tani Dahu users worldwide, displayed as ruled ledger-style rows.
  • Detail Produk: The full product detail surface with buy, seller chat, share, and WhatsApp contact.
  • Produk Baru: The focused form for a seller to upload and manage a product listing.
  • propil pengguna: The user profile surface with cover photo, profile photo, followers/following, domicile, full address, and profile sharing.
  • Analytics Profil: The pinned ink-bordered analytics panel above the profile header showing pengunjung profil, penonton produk, and pengikut baru.
  • cat: The real-time chat feature between all Tani Dahu users.
  • diagnosa AI: The Gemini-powered plant disease diagnosis feature with solutions and treatment.
  • Cuaca: The real-time weather feature showing rain, wind, and heat for the user's location.
  • Panduan Budidaya: The field tools surface with calendar, cost calculator (hitung modal), fertilizer code screen (screen kode pupuk), cultivation (budidaya), and complete planting guides.
  • Notifikasi: The system notification list for chat, product sales, photos, and videos.
  • Peganturan sistem: The system settings surface with help, account settings, privacy policy, and logout.
  • Moderasi: The interaction destination for reporting a post and blocking a user.
  • Privacy Policy: The detailed privacy policy page about the Tani Dahu application.
  • Delete Account: The page for requesting account deletion.
  • Login / Register / Lupa Password: The identity access surfaces for email + password login, self-service registration, and password recovery.
  • Supabase Storage: The cloud storage service for all media and data.
  • Supabase Realtime: The real-time synchronization service for feed, marketplace, profile, chat, weather, and notifications.
  • Supabase Auth: The authentication service for registration, login, forgot password, and returning verification.
  • Gemini API: The AI service powering plant disease diagnosis.
  • WhatsApp: The external destination for contacting sellers.
  • AAB / APK: The Android App Bundle and Android Package Kit artifacts delivered for Google Play Store.
  • Harga coret: The struck-through original price shown alongside the current price in the marketplace.
  • Hitung modal: The cost calculator tool in Panduan Budidaya.
  • Screen kode pupuk: The fertilizer code lookup screen in Panduan Budidaya.
  • Budidaya: The cultivation guide content in Panduan Budidaya.

No completed page designs yet.

Completed design pages will appear here when they are ready to preview.

Beranda: Arrive anonymously via link
marketplace: 1. Browse worldwide listings
Detail Produk: 2. View product detail
Login: 3. Sign in to continue
Register: 4. Create account
Detail Produk: 5. Press BELI
cat: 1. Chat with seller
Detail Produk: Open WhatsApp to seller
Detail Produk: 6. Share product
Detail Produk: 2. Retry chat or WhatsApp
propil pengguna: 7. View seller profile
Moderasi: 8. Report listing or block seller
Notifikasi: 3. Open seller reply
Peganturan sistem: 9. Log out

No completed page designs yet.

Completed design pages will appear here when they are ready to preview.

Beranda: Arrive anonymously via link
marketplace: 1. Browse worldwide listings
Detail Produk: 2. View product detail
Login: 3. Sign in to continue
Register: 4. Create account
Detail Produk: 5. Press BELI
cat: 1. Chat with seller
Detail Produk: Open WhatsApp to seller
Detail Produk: 6. Share product
Detail Produk: 2. Retry chat or WhatsApp
propil pengguna: 7. View seller profile
Moderasi: 8. Report listing or block seller
Notifikasi: 3. Open seller reply
Peganturan sistem: 9. Log out