The hard problem
Ordu Genç İş İnsanları Derneği needed a private member app, not a public social network.
~180 invite only members, six roles (root → üye), and board approvals that must survive
presidency transfers without orphaning queues. Shares, sector purchase requests, and dues
all needed different feeds, notification rules, and audit trails on a mobile only
surface with unreliable push delivery and Turkish calendar billing.
Key decisions
Role based approvals, not person based queues. Post and purchase
requests are approved by yk_baskan /
yk_vekili roles so a presidency
transfer does not break pending work.
Separate share vs purchase feeds. Event style posts and sector buying
announcements never merge in the API. Different schemas, paths, and notification targets.
Deno + Yelix/Hono + MongoDB. OpenAPI first REST for a Flutter client,
Zod validation end to end, Coolify self hosting, R2 for media, FCM with retry cron,
Istanbul aware dues jobs.
Root Admin Ask with read only Mongo. OpenRouter chat can query association
data only through a readonly URI, so ops Q&A cannot mutate production state.
Key Features
• Member directory & companies. Invite only accounts, company profiles, sector tags
• Share feed. Moderated posts with media, comments, redflag filtering
• Purchase requests. Sector buying pipeline → separate announcement feed
• Dues (aidat). Monthly rows, role multipliers, partial payments, reminder cron
• Notifications. In app inbox + FCM device tokens, event level push prefs
• Governance. Soft archive for members, hard delete + audit for companies
• Admin Ask. Root only AI over read only aggregates
Technical Implementation
| Component |
Technology |
Purpose |
| API runtime | Deno | TypeScript server + cron |
| HTTP / OpenAPI | Hono + Yelix | REST /v1 · Scalar docs |
| Validation | Zod | Request/response schemas |
| Database | MongoDB + Mongoose | Members, feeds, dues, audits |
| Auth | JWT + refresh (DB) | Single device sessions |
| Push | Firebase FCM | Per device notifications + retry |
| Email / SMS | Resend · Twilio | Reset codes, YK alerts, verify |
| Object storage | Cloudflare R2 | Avatars, logos, post media |
| AI | OpenRouter | Root Admin Ask |
| Deploy | Docker + Coolify | Self hosted API |
| Client | Flutter | Production mobile UI |
| Observability | Sentry | Errors + cron spans |
Running today
~180
Invite only members
6
Roles
50+
API test files