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.
D9: Legal Entity — ALAI Tech d.o.o.
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:
- Corporate simplicity: One entity for all ALAI Serbian operations
- Cost efficiency: One incorporation, one tax filing, one audit (vs 3x overhead)
- Capital pooling: EUR 125,000 NBS PI license capital serves all products
- Regulatory efficiency: Single NBS/Poverenik/APML relationship
- 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)
- Legal entity structure:
docs/bookstack/01-legal-entity.md - Full decision context:
docs/05-decision-log.md#d9
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:
- ALAI standard: All products must use Kotlin/Ktor (consistency, shared knowledge)
- Type safety: Kotlin compiler catches errors at compile-time (vs runtime in TypeScript)
- Performance: Ktor netty transport faster than Node.js event loop
- Ecosystem: Better PostgreSQL support (Exposed ORM vs Prisma/Drizzle)
- 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:
- Redesign from scratch (new UX, new components)
- 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:
- Proven UX: Drop Norway tested with real users (positive feedback)
- Faster time-to-market: No need to reinvent UI patterns
- Focus on localization: Effort on Serbian language/culture, not design
- 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:
- Unblock CI: Cannot merge PRs if coverage gate fails due to infra issue
- Realistic gate: 52% unit coverage still enforces quality (better than 0%)
- Pending fix: docker-java PR expected Q3 2026
- 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:
- Latin (latinica): Standard in tech, banking, official documents
- Cyrillic (ćirilica): Traditional, used in media, education
Decision:
Drop Srbija MVP uses Latin script only. Cyrillic support added in Phase 2 (post-MVP).
Rationale:
- Banking standard: All Serbian banks use Latin for digital interfaces
- NBS IPS: NBS IPS API uses Latin (IBAN, PIB, names)
- Tech ecosystem: Serbian tech products default to Latin (Viber, TikTok, Instagram)
- Faster MVP: No need for script toggle, translation duplication
- 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:
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