Sowan-Almanac: Dignity Guard for Intergenerational Wisdom
Inspiration
In Indonesia, the tradition of sowan — visiting an elder to seek wisdom — is fading. Younger generations scroll TikTok while 20+ million seniors face social isolation. Meanwhile, most AI scheduling platforms optimize for efficiency: cram as many meetings as possible. But elders don't operate on calendar logic — they operate on energy.
We asked: What if an AI agent protected an elder's dignity instead of maximizing their availability?
That question birthed Sowan-Almanac — a platform where two ASI:ONE agents negotiate meetings with elder energy as the primary constraint. Not "when is there a free slot," but "when is Mbah ready to share wisdom?"
What it does
Sowan connects young learners with elder mentors ("sesepuh") through an AI-mediated scheduling system built on ASI:ONE.
Three roles, one platform:
- Customer — browses available elder slots, sends their "niat sowan" (intention to visit), and receives a warm Bahasa Indonesia response from the ElderAgent
- Mentor Lansia (Elder) — manages their availability, publishes energy-aware slots, reviews incoming intentions, and completes sessions
- Admin — oversees the entire platform: slot usage, booking activity, and AI agents status
The killer feature: When a customer books, the request goes through ASI:ONE's Dignity Guard — an LLM agent that evaluates the elder's energy context, negotiates alternatives if needed, and always responds in warm, respectful Bahasa Indonesia. No cold "booking confirmed" emails. Instead: "Mbah Karto menerima niat baikmu. Beliau lebih segar di jam 9 pagi — bagaimana?"
How we built it
- Next.js 16 (Turbopack) — App Router with 22 routes, serverless API endpoints, static generation
- TypeScript — strict mode, zero
anytypes - Tailwind CSS 4 + shadcn/ui — charcoal/gold design system with glassmorphism cards
- ASI:ONE API (
asi1-mini) — powers the Dignity Guard agent via OpenAI-compatible chat completions - Custom ElderAgent — a prompt-engineered layer that translates scheduling logic into warmth: energy-aware negotiation, alternative suggestion, and Bahasa Indonesia tone
- Persistent store — file-based (
/tmpon Vercel) + client-side localStorage fallback for serverless consistency - Vercel — production deployment with environment variables for ASI:ONE credentials
- i18n — 5 languages (Indonesian, English, Japanese, Korean, Chinese) via React Context
The architecture splits cleanly:
app/agents/— dual-tab Pendopo Digital (customer booking + elder management)app/api/agents/— 5 REST endpoints (status, book, slots, bookings, reset)lib/agents/— ASI:ONE client, ElderAgent class, store operations, persistence
Challenges we ran into
1. Vercel serverless state — In-memory state dies between requests. We solved this with a dual persistence layer: file-based /tmp storage (survives within a warm instance) + localStorage sync on the client side via every API response.
2. Prompt engineering for warmth, not efficiency — The first version of the ElderAgent sounded like a customer support bot. We rewrote the system prompt 6 times to get the right tone: respectful, elder-voiced, never clinical. The breakthrough was framing the agent as a guardian of the pendopo rather than a scheduler.
3. Energy-awareness in LLM output — Getting ASI:ONE to consistently consider elder energy (not just slot availability) required structured prompting with explicit energy levels (morning vs. evening, session count per day, rest periods).
4. Full message display — ASI:ONE responses can be long and nuanced. We had to strip all truncation (slice(0, 200)) and use whitespace-pre-line throughout to ensure elders' full wisdom is shown.
5. Dual-role UI on one page — The Pendopo Digital page serves both customers and elders. The tab switching, state management, and conditional rendering (status badges, action buttons, contextual hints per role) added significant complexity.
Accomplishments that we're proud of
- First platform (that we know of) using AI to protect elder energy in scheduling — not just automate it
- Full 3-role auth + routing — Customer, Mentor Lansia, and Admin each see their own world
- Admin dashboard in one viewport — information-dense but scroll-free: stats, user overview, bookings table, agent status
- ASI:ONE integration that feels Javanese-warm — the responses don't just inform, they connect
- Clean build, zero errors — TypeScript strict mode, 22 routes, production deployment in under 30 seconds
- 5-language i18n — agents and admin pages fully translatable (id/en/ja/ko/zh)
What we learned
- LLMs can be guardians, not just workers — Reframing the agent from "scheduling assistant" to "dignity guardian" completely changed the output quality
- Serverless state is the hidden tax — What works in local dev breaks on cold starts. Dual persistence layers are a pragmatic patch, but real databases (Supabase) remain the right answer for production
- Role-based UI with a single agent page — Adding conditional rendering per role (status hints, action buttons, filter views) makes one page serve many users without needing 3 separate agent pages
- Energy as a scheduling primitive — Traditional booking systems treat time as infinite and divisible. Elders teach us that readiness matters more than availability
What's next for Sowan-Almanac: Dignity Guard for Intergenerational Wisdom
- Supabase database — migrate from demo/localStorage to real auth + persistent storage
- Multi-elder support — currently one elder profile per deployment; scale to many sesepuh with individual Dignity Guards
- Elder analytics — dashboard showing elder energy patterns over time (peak hours, session fatigue)
- Video sowan — integrate Agora/Daily.co for actual face-to-face sessions (currently simulated)
- Community features — collective sowan logs, wisdom sharing, elder spotlights
- Mobile-first PWA — elders use phones; the app needs to be installable and touch-optimized
- Real payments — Midtrans integration with escrow for session fees
Built With
- asi:one
- css
- javascript
- next.js-16
- react
- tailwind-css
- typescript
- vercel

