Developing a Petitions Mobile Application
A petitions app is a tool for civic action: users create requests, collect signatures, track progress. Technically, the task reduces to reliable authentication, protection against signature fraud, and transparent data display.
Protection Against Fraud: Most Important
Petition signatures have legal and public significance. One signature = one verified person—this requirement must be solved at multiple levels.
Phone verification: SMS with OTP via Twilio Verify or Firebase Phone Auth. One number = one signature per petition. FirebaseAuth.verifyPhoneNumber() on client, server checks uid from Firebase token. Protection against automation: rate limiting at API gateway (max 3 requests per minute from one IP on verification endpoint).
Email verification as additional layer. sendEmailVerification() in Firebase Auth. Unverified email = no signature right.
Biometric confirmation for repeated signatures: if user signs multiple petitions in a row, ask Face ID / Touch ID confirmation (LocalAuthentication.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics)). Reduces risk of accidental or automated actions.
Android: BiometricPrompt from androidx.biometric. Always check BiometricManager.canAuthenticate(BIOMETRIC_STRONG) before showing—on emulator and some devices without sensor this isn't SUCCESS.
Signing: UX and Technical Details
Signature form: minimal fields. Name, location (optional, with consent), email or phone. Long forms reduce conversion. Android autofillHints in TextInputLayout fills data from password manager.
Signature saves immediately via URLSession / OkHttp with optimistic counter update. If request fails—rollback counter, show retry. Duplication prevented server-side via unique index (petition_id, user_id)—even if client sends two requests simultaneously.
Real-time signature counter: WebSocket or Server-Sent Events. SSE simpler: URLSessionStreamTask (iOS) or EventSource library (Android). On reaching thresholds (1000, 10000, 100000 signatures)—push notification to all signers via FCM topic.
Creating a Petition
Editor: title, description (rich text via UITextView with basic formatting or Lexical in WebView), cover image, category, signature goal, addressee (organization, politician, company).
Petition moderation before publishing: queue in admin panel. Statuses: draft → pending_moderation → published / rejected. Authors get push on status change.
Progress and Deadline
Progress bar to goal: UIProgressView (iOS) / LinearProgressIndicator (Compose). Petition deadline: DateComponentsFormatter for "3 days left," CountdownTimer on screen for last hours.
When deadline expires—petition transitions to closed status. If goal reached—status successful, batch notification to all signers encouraging spread.
Sharing
Petitions must share easily. Dynamic links (Firebase Dynamic Links or Branch.io) open specific petition in app or web—via UIActivityViewController (iOS) or Intent.ACTION_SEND (Android). Open Graph tags for messenger previews—on web page side.
Timeline
Petition list + view + sign with phone verification: 3–5 weeks. Create petitions + moderation + real-time counter + sharing: 2–3 months. Pricing calculated after requirements analysis.







