Inspiration
Approve: The Loan Officer was inspired by tense desk-job simulation games where small administrative decisions slowly become moral, financial, and personal pressure. I wanted to build a compact but playable loan officer experience: the player sits at a bank desk, reviews applicant documents, weighs risk against policy, and decides whether to approve or reject each case.
The goal was not to make a simple form-checking toy. I wanted each applicant to feel like a person with a situation, a financial tension, and a reaction to the decision.
What it does
Approve is a bounded pixel-art narrative management game about working as a bank loan officer. The player reviews applicant files, checks documents, compares details, and makes approval decisions under quota and pressure.
The current Build Week version includes:
- A playable landscape work-desk interface
- Multiple applicant/customer profiles
- Data-driven documents and case content
- Approve/reject decisions with reactions
- Deterministic game-state logic separated from presentation
- A verified production web build
- A test suite covering the core simulation and scenario behavior
The latest content pass added four distinct customer profiles: Kora Isen, Niko Vey, Sali Eren, and Ilya Fen. Each profile has a different financial tension, loan purpose, document set, and decision feedback.
How I built it
The project is built with TypeScript, React, and Vite. The game logic is designed as a deterministic simulation layer independent from rendering, while applicants, documents, policies, story events, and consequences are data-driven.
I used Codex and GPT-5.6 during Build Week to move quickly from implementation tasks to verification. Codex helped with focused content expansion, compatibility fixes, test running, build verification, and submission preparation. GPT-5.6 was used for planning, tightening scope, shaping the project story, and keeping the final submission focused.
Challenges I ran into
The biggest challenge was time. With the deadline approaching, I had to avoid scope creep and focus only on what made the game more playable and understandable to judges.
Another challenge was presentation stability. Since the game is desk-based, small layout issues can make documents, stamps, trays, or UI elements feel broken. I focused on keeping the work desk bounded and readable instead of adding more mechanics late.
There was also a deployment compatibility issue where Array.prototype.at worked locally but failed in the Vercel TypeScript build environment. I fixed it by replacing those calls with safer indexed access.
Accomplishments that I'm proud of
I am proud that the project reached a playable, test-verified state under a very tight deadline. The final submitted build has:
- 180/180 tests passing
- lint passing
- production build passing
- a clean Git commit
- a public repository
- a live web deployment
I am also happy with the core fantasy: the game now clearly communicates “you are the loan officer,” and every case asks the player to make a judgment rather than just click through screens.
What I learned
I learned how important scope control is during a hackathon. The project became better when I stopped adding new systems and focused on making the existing loop understandable, testable, and playable.
I also learned that AI coding tools are most useful when given narrow, verifiable tasks: add specific content, fix one blocker, run tests, report status, and stop.
What's next for Approve: The Loan Officer
Next, I would like to expand the campaign with more applicant types, delayed consequences, stronger manager pressure, and more readable document interactions.
Future versions could also include:
- More narrative days
- More household and personal pressure
- Better applicant portraits and document art
- Improved sound and desk animations
- Android and iOS packaging through Capacitor
- Later PC packaging through Tauri
Built With
- codex
- css
- deterministic-simulation
- game-design
- gpt-5.6
- html5
- pixel-art
- react
- typescript
- vite
Log in or sign up for Devpost to join the conversation.