Skip to main content

CEO Decision Log (D9-D14)

CEO Decision Log (D9-D14)

Context: Major architectural and strategic decisions made during Drop Srbija v2 rebuild.

All decisions D1-D8 documented in existing docs/05-decision-log.md. This chapter covers v2-specific decisions D9-D14.


Date: 2026-04-16
Decision ID: D9
Status: Active (Incorporation Pending)

Context:

Early Drop Srbija documentation referenced "Drop Srbija d.o.o." as the intended legal entity for Serbian operations. This implied separate incorporation per product line (Drop, Bilko, Tok).

Decision:

Drop Srbija operates as a product line under ALAI Tech d.o.o. (single Serbian subsidiary of ALAI Holding AS). No separate "Drop Srbija d.o.o." will be incorporated.

Rationale:

  1. Corporate simplicity: One entity for all ALAI Serbian operations
  2. Cost efficiency: One incorporation, one tax filing, one audit (vs 3x overhead)
  3. Capital pooling: EUR 125,000 NBS PI license capital serves all products
  4. Regulatory efficiency: Single NBS/Poverenik/APML relationship
  5. Brand architecture: Legal entity = ALAI Tech, product brands = Drop/Bilko/Tok

Consequences:

  • ✅ Reduced costs, simplified structure, easier capital management
  • ❌ All products share liability under one entity
  • ⚠️ Must maintain strong compliance (one NBS audit covers all)

D10: Backend — Kotlin/Ktor (ALAI Standard)

Date: 2026-04-17
Decision ID: D10
Status: Active

Context:

Drop Srbija v1 prototype used Hono (TypeScript) backend. ALAI standard mandates Kotlin/Ktor for all products (CEO decision 2026-02-25).

Decision:

Drop Srbija v2 backend uses Kotlin 2.1.0 + Ktor 3.1.2, replacing Hono/TypeScript.

Rationale:

  1. ALAI standard: All products must use Kotlin/Ktor (consistency, shared knowledge)
  2. Type safety: Kotlin compiler catches errors at compile-time (vs runtime in TypeScript)
  3. Performance: Ktor netty transport faster than Node.js event loop
  4. Ecosystem: Better PostgreSQL support (Exposed ORM vs Prisma/Drizzle)
  5. Team expertise: Petter Graff (CodeCraft lead) Kotlin expert

Alternatives Rejected:

  • Keep Hono/TypeScript: Violates ALAI standard, divergent tech stack
  • Node.js Express: Slower than Ktor, callback hell
  • Go: No ALAI expertise, steeper learning curve

Consequences:

  • ✅ ALAI standard compliance, better performance, type safety
  • ❌ Full backend rewrite (20 modules, 22 migrations)
  • ⚠️ Learning curve for team members without Kotlin experience

Evidence:

  • Backend directory: backend/ (Kotlin/Ktor, not TypeScript/Hono)
  • 617 tests passing (79 Kotest files)

D11: Frontend — Drop Norway 1:1 Copy

Date: 2026-04-17
Decision ID: D11
Status: Active

Context:

Two frontend strategies considered:

  1. Redesign from scratch (new UX, new components)
  2. 1:1 copy from Drop Norway (proven UX, localize for Serbia)

Decision:

Drop Srbija v2 frontend is a 1:1 copy of Drop Norway with minimal changes (NOK→RSD, BankID→OTP, Vipps→NBS IPS, nb-NO→sr-RS).

Rationale:

  1. Proven UX: Drop Norway tested with real users (positive feedback)
  2. Faster time-to-market: No need to reinvent UI patterns
  3. Focus on localization: Effort on Serbian language/culture, not design
  4. Lower risk: Known UX, fewer unknowns

Changes:

  • Currency: NOK → RSD
  • Auth: BankID → Phone OTP
  • Payment: Vipps → NBS IPS
  • Language: Norwegian (nb-NO) → Serbian (sr-RS)
  • National ID: Personnummer → JMBG (13 digits)

Consequences:

  • ✅ Faster MVP, proven UX, lower risk
  • ❌ Less differentiation from Drop Norway
  • ⚠️ Serbian users may expect different UX patterns (future feedback)

Evidence:

  • 30 pages adapted (1:1 copy with changes)
  • 6 new Serbian components (JMBG, PhoneSR, IBANSR, PIB, NBSIPS, OTP)
  • 145 i18n keys (sr-RS)

D12: JaCoCo Gate — 52% Unit-Only (Temporary)

Date: 2026-04-17
Decision ID: D12
Status: Active (Pending docker-java Fix)

Context:

ALAI standard: 60% test coverage gate. Drop Srbija v2 backend achieves 60% with unit + integration tests (Testcontainers). However, docker-java issue on M-series Macs causes Testcontainers to hang in CI (GitHub Actions).

Decision:

Temporarily lower coverage gate to 52% unit-only until docker-java issue fixed. Integration tests run locally but disabled in CI.

Rationale:

  1. Unblock CI: Cannot merge PRs if coverage gate fails due to infra issue
  2. Realistic gate: 52% unit coverage still enforces quality (better than 0%)
  3. Pending fix: docker-java PR expected Q3 2026
  4. Future restoration: Will restore 60% gate (unit + integration) once fixed

Target Timeline:

  • Now (2026-04-17): 52% unit-only gate
  • Q3 2026: docker-java fixed → re-enable integration tests → 60% gate

Consequences:

  • ✅ CI unblocked, PRs can merge
  • ❌ Lower coverage than ALAI standard (temporary)
  • ⚠️ Must manually run integration tests locally before merge

Evidence:

  • JaCoCo report: 52.1% (unit-only)
  • backend/build.gradle.kts: Coverage rule set to 52%
  • Comment in CI: "Integration tests disabled due to docker-java M-series Mac issue"

D13: Script — Latin MVP, Cyrillic Phase 2

Date: 2026-04-17
Decision ID: D13
Status: Active

Context:

Serbian language uses two scripts:

  1. Latin (latinica): Standard in tech, banking, official documents
  2. Cyrillic (ćirilica): Traditional, used in media, education

Decision:

Drop Srbija MVP uses Latin script only. Cyrillic support added in Phase 2 (post-MVP).

Rationale:

  1. Banking standard: All Serbian banks use Latin for digital interfaces
  2. NBS IPS: NBS IPS API uses Latin (IBAN, PIB, names)
  3. Tech ecosystem: Serbian tech products default to Latin (Viber, TikTok, Instagram)
  4. Faster MVP: No need for script toggle, translation duplication
  5. User preference: Research shows 80%+ young Serbians prefer Latin for digital

Phase 2 Plan:

  • Add script toggle (settings)
  • Duplicate i18n keys: sr-Latn.json + sr-Cyrl.json
  • Auto-detect user preference (browser locale or IP)

Consequences:

  • ✅ Faster MVP, aligns with banking UX
  • ❌ Cyrillic users may feel excluded (mitigated: majority prefer Latin)
  • ⚠️ Phase 2 effort: 145 keys × 2 scripts = 290 translation keys

Evidence:

  • Frontend i18n: sr.json (Latin only)
  • No Cyrillic translation files

D14: Mobile Target — Samsung Galaxy A54 (Not iPhone)

Date: 2026-04-17
Decision ID: D14
Status: Active

Context:

Drop Srbija is mobile-first (phone-based auth, QR payments). Primary test device must represent majority of Serbian users.

Decision:

Primary mobile test device: Samsung Galaxy A54 (Android), not iPhone.

Rationale:

  1. Market share: Android 78% in Serbia (Samsung dominant brand)
  2. Price point: Galaxy A54 (RSD 40,000 / ~$370) matches middle-class budget
  3. Screen size: 6.4" (Serbian users prefer larger screens)
  4. Banking apps: All Serbian banks optimize for Samsung (not iPhone)
  5. NFC support: Galaxy A54 has NFC (needed for future card payments)

iPhone Support:

  • Still tested (Playwright cross-browser)
  • Not primary optimization target
  • iOS < 20% market share in Serbia

Consequences:

  • ✅ Aligns with Serbian market, realistic testing
  • ❌ iPhone users may experience suboptimal UX (acceptable trade-off)
  • ⚠️ Must still ensure iOS compatibility (no P0 bugs)

Evidence:

  • Playwright config: defaultBrowserType: 'chromium' (Android Chrome)
  • Lighthouse tests: Mobile profile (Galaxy A54 viewport)
  • No iPhone-specific optimizations (e.g., haptic feedback)

Summary Table

Decision Date Status Impact
D9: ALAI Tech d.o.o. 2026-04-16 Active Legal entity consolidation
D10: Kotlin/Ktor 2026-04-17 Active Backend tech stack
D11: Drop Norway 1:1 2026-04-17 Active Frontend strategy
D12: 52% Coverage Gate 2026-04-17 Temporary CI unblocking
D13: Latin Script MVP 2026-04-17 Active Localization scope
D14: Samsung Galaxy A54 2026-04-17 Active Mobile test target

Full Decision Log: docs/05-decision-log.md (D1-D14)
Next Review: After Phase 5 (NBS IPS integration) or major architectural change