Vancouver, BC · Product, strategy, technology

Hit a letter three times. Hold Shift to attract the loose ones.

I'm Abhi. I turn rough problems into useful products across AI, planning, and new ventures.

Enter the work ↓
0 / 10 released

Games

Four things I builtand kept playing.

Two Godot games you can download and play, the asset pipeline they both run on, and one experiment that failed honestly. Design decisions, and what changed after I played them.

Gleipnir screenshot
SoulslikeFree on itch.io

Gleipnir

A parry duel in two inks, and five bosses that teach themselves.

A 2.5D Norse folk-horror action game where the shield is half the moveset. Light weapons get a forgiving parry window and heavy ones a tight one, so picking the greatsword is choosing a harder read, and mashing decays the window to nothing. Five bosses share one readability grammar — one tell per attack, a consistent commit cue, red means you cannot parry it — so learning one fight teaches you how to read the next. I re-scoped the whole game after playing it: the metroidvania levels felt like a chore, so it became a boss-first structure of short missions.

  • Godot 4
  • GDScript
  • Combat design
  • Boss design
  • Playtest tuning
Play on itch.io
The Merciful screenshot
Narrative systemsFree on itch.io

The Merciful

A kraken cult, a 24-day voyage, and a crew that is starting to talk.

You are a secret kraken-worshipper cooking for a 1715 brig. Suspicion and rumour do the work an enemy AI usually does, and the whole thing is built on one rule: you should only ever be caught for a reason you could have read. Conversations are timed rather than menu-driven, so hesitating costs something. Playtesting found one loop beat everything else, so I priced every action in time and re-ran scripted strategies across seeds until careful play could lose again.

  • Godot 4
  • GDScript
  • Systems design
  • Narrative design
  • Balance sweeps
Play on itch.io
Oddlings Studio screenshot
Art pipelineOpen source

Oddlings Studio

Procedural 3D assets you can review instead of just accept.

The asset pipeline both of my Godot games run on. Agents author JSON specs, the studio builds them into rigged meshes, and a human reviews the result in an outliner with notes and draw-marks — generated art is something you edit and sign off on, not a black box. It is deterministic, so the same seed produces the same bytes and an asset can be regenerated and diffed like code. Two mesh backends: parts as separate closed solids, or fused as a signed distance field into one manifold mesh under a triangle budget.

  • TypeScript
  • Procedural generation
  • Rigging
  • MCP
  • Tooling
Repository
fly-balatro screenshot
Game AI researchResearch

fly-balatro

Can a fruit fly's brain play Balatro? Mostly, no.

I wired the MaleCNS fly connectome up as a frozen spiking reservoir, fed it encoded Balatro hand state, and put decoders on top to see whether real neural wiring beat a shuffled control. It did not. The honest result is a string of null and negative findings with the controls documented, including a retraction of my own earlier claim once I found the shuffled baseline was broken.

  • Python
  • Connectomics
  • Reservoir computing
  • Experiment design
Repository

Three projects, opened up

The work behind
the work.

Scroll slowly. Each chapter has something to operate.
BoardroomAgent infrastructure01 / 03

One desk for an entire agent team. 

Boardroom turns parallel coding agents into an operating system: assign work, isolate it, watch it run, resolve conflicts, and review the result without stitching together terminal windows by hand.

My role
Product, interaction, architecture, full-stack build
Core stack
Next.js, TypeScript, SQLite, node-pty, SSE, Git worktrees
What shipped
Self-hosted agent OS, review queue, plan engine, nine-tool MCP server
Brief on the tableShip passwordless auth0/5 tasks assigned
Discarddrop task

Drag at least three cards onto the agents. Double-click a card to duplicate it.

assigned0finished0tokens0spend$0.00tests0

The problem

More agents create more coordination work. Parallel branches collide, context disappears between sessions, and “done” still needs a human to find the diff, test it, and decide what ships.

The system

Named personas run Claude, Codex, Hermes, or OpenCode inside isolated Git worktrees. Plans can run sequentially or in parallel; completed work enters a push-request queue, and a resolver agent handles merge conflicts.

The hard part

The UI is only the surface. Underneath it are persistent sessions, PTY process control, live SSE logs, a four-second dispatcher, branch lifecycle management, and enough recovery state to survive an agent failing halfway.

Explore the repository ↗
145passing tests
4agent runtimes
30+REST endpoints
9MCP tools
PocketLogConsumer finance02 / 03

Receipts in. Clarity out. 

PocketLog removes the tiny decisions that make expense tracking fall apart. Scan the thing already in your pocket; the product turns it into useful, shared financial context.

My role
Product direction, experience design, application build
Core loop
Scan receipt, verify extraction, update budget, share the picture
What shipped
Mobile-first expense tracker with receipt scanning and family budgets
POCKETLOG LABTurn paper into a useful decision.

Drag the receipt into the scanner.

YOUR POCKET
DROP RECEIPT HERECAMERA FRAME
inputpaper receiptmodelvision extractionresultloose

The behavior problem

Budget tools fail when logging costs more attention than the purchase. PocketLog starts from the receipt, then extracts merchant, amount, and category so the useful habit takes one action instead of six.

The product loop

Capture feeds a live budget, the budget reveals spending patterns, and family sharing turns private bookkeeping into a shared picture. The value arrives immediately, then compounds with every scan.

The design judgment

AI stays backstage. People see an editable result rather than a chatbot: a faster default, clear confidence, and an obvious place to correct the machine when it guesses wrong.

Open PocketLog ↗
1 scanfrom paper to entry
3 fieldsfilled automatically
livebudget feedback
sharedfamily context
SQL-R1Model distillation03 / 03

The best model was hiding at iteration fifty. 

A weekend experiment became a lesson in evaluation: more data was not always better, DPO actively hurt, and the default final checkpoint concealed the strongest result.

My role
Experiment design, trace pipeline, training, evaluation, write-up
Core stack
Python, MLX-LM, LoRA, DeepSeek-V4-Pro, Qwen2.5-Coder-7B
Proof standard
200 held-out BIRD questions, deterministic SQL execution match
CHOOSE A TRAINING PATHDon’t trust the last checkpoint.
ITER 5055.0%
THE CHECKPOINT
ITER 5055.0%best measured checkpoint
THE MODEL IS MEMORIZING
ITER 0ITER 300
generalization peak55.0% pass@1

The useful path rises early, peaks at iteration 50, then gives accuracy back as training continues.

The question

Can a seven-billion-parameter local model absorb SQL reasoning from a much stronger teacher cheaply enough to make the experiment reproducible on Apple Silicon?

The pipeline

DeepSeek-V4-Pro generated traces for BIRD questions. Only execution-correct SQL survived. A rank-16 LoRA adapter trained on 708 accepted traces, then every checkpoint was scored by deterministic execution match.

What the failures taught

Combining a weaker teacher doubled the data but underperformed. DPO fell to 24–27.5%. The winning iteration-50 checkpoint reached 55%; the automatic last save had already overfit back to 49%.

Read the experiment log ↗
+7.5 ppexecution accuracy
$5.83teacher-model spend
708accepted traces
14 hlocal GPU time

Selected work

Everything I've shipped,on one page.

20 products, tools, and experiments, newest first. Skim the list and open any row for the story, the stack, and the links.

20 projectsnewest first

  1. A 2.5D Norse folk-horror action game where the shield is half the moveset. Light weapons get a forgiving parry window and heavy ones a tight one, so picking the greatsword is choosing a harder read, and mashing decays the window to nothing. Five bosses share one readability grammar — one tell per attack, a consistent commit cue, red means you cannot parry it — so learning one fight teaches you how to read the next. I re-scoped the whole game after playing it: the metroidvania levels felt like a chore, so it became a boss-first structure of short missions.

    • Godot 4
    • GDScript
    • Combat design
    • Boss design
    • Playtest tuning
  2. You are a secret kraken-worshipper cooking for a 1715 brig. Suspicion and rumour do the work an enemy AI usually does, and the whole thing is built on one rule: you should only ever be caught for a reason you could have read. Conversations are timed rather than menu-driven, so hesitating costs something. Playtesting found one loop beat everything else, so I priced every action in time and re-ran scripted strategies across seeds until careful play could lose again.

    • Godot 4
    • GDScript
    • Systems design
    • Narrative design
    • Balance sweeps
  3. The asset pipeline both of my Godot games run on. Agents author JSON specs, the studio builds them into rigged meshes, and a human reviews the result in an outliner with notes and draw-marks — generated art is something you edit and sign off on, not a black box. It is deterministic, so the same seed produces the same bytes and an asset can be regenerated and diffed like code. Two mesh backends: parts as separate closed solids, or fused as a signed distance field into one manifold mesh under a triangle budget.

    • TypeScript
    • Procedural generation
    • Rigging
    • MCP
    • Tooling
  4. I wired the MaleCNS fly connectome up as a frozen spiking reservoir, fed it encoded Balatro hand state, and put decoders on top to see whether real neural wiring beat a shuffled control. It did not. The honest result is a string of null and negative findings with the controls documented, including a retraction of my own earlier claim once I found the shuffled baseline was broken.

    • Python
    • Connectomics
    • Reservoir computing
    • Experiment design
  5. A research tool for player props. It ingests lines from two pick'em books, pairs them, and scores every prop by cross-book value and calibrated probability instead of hype. A parlay slip de-vigs prices and grades legs, saved slips auto-grade against ingested box scores, and an insights page publishes the model's own Brier score and ROI.

    • Next.js
    • TypeScript
    • Supabase
    • Edge functions
    • Calibration
  6. A from-scratch agent harness with a consumer-grade UI. Errand tidies folders, reads and explains documents, researches the web, and drives your real Chrome, but asks in plain language before anything changes and ships a structural Undo. The loop, tools, sessions, streaming, memory, and crash-safe resume are hand-written TypeScript; the model SDK is transport only.

    • TypeScript
    • Electron
    • SQLite
    • Chrome extension
    • Agent harness
  7. A travel-social app that matches you with people heading to the same city on overlapping dates. Co-founded with Parth Shah; I am the CTO and built most of it: a ranked discovery deck, matches and group chat, trips, Sign in with Apple, a transactional email system on Resend, and an iOS build through Capacitor. Currently invite-only behind a waitlist.

    Built with Parth Shah

    • Next.js
    • Supabase
    • Capacitor
    • Resend
    • iOS
  8. An orchestration platform for spawning, monitoring, and coordinating fleets of Claude Code agents. Named personas run in isolated Git worktrees, plans execute sequentially or in parallel, finished work lands in a push-request queue, and a nine-tool MCP server exposes the whole thing to any MCP client.

    • TypeScript
    • Next.js
    • MCP
    • node-pty
    • Git worktrees
  9. A browser game where players compress prompts for gpt-oss-20b across 19 holes. Deterministic code-first grading handles most cases, an LLM judge covers the fuzzy ones, and a live leaderboard turns prompt design into a competitive sport.

    • gpt-oss-20b
    • LLM evaluation
    • Prompt design
    • Leaderboards
  10. Automatically extracts facts from every Claude Code session with a local LLM, embeds them with nomic-embed-text, and recalls them semantically next time. Zero cloud, zero API keys, exposed as an MCP server.

    • Python
    • FastMCP
    • SQLite
    • Ollama
    • Claude Code
  11. A six-week experiment in unfamiliar territory: a Python walk-forward backtester, a six-account paper-trading engine, and a live dashboard. It became a study of where AI accelerates building and where expert skepticism still matters.

    • Python
    • Claude
    • Backtesting
    • TradingView
  12. Distilled DeepSeek-V4-Pro into Qwen2.5-Coder-7B on Apple Silicon with LoRA and scored every checkpoint on BIRD with deterministic execution match. Accuracy went from 47.5% to 55%, DPO actively hurt, and the best checkpoint was hiding at iteration fifty.

    • Python
    • MLX-LM
    • LoRA
    • Distillation
    • BIRD
  13. A native macOS menu bar app: highlight text anywhere, hit one hotkey, get rewrites from a local model or your ChatGPT subscription in a popup. Mono theme, a one-to-five variant slider, and a Windows tray version on the roadmap.

    • Swift
    • macOS
    • Local models
    • Native app
  14. A seat-availability watcher for Cineplex screenings. Pick the seats you care about and it polls the seat map, then alerts you the moment a cancellation frees one up.

    • JavaScript
    • React
    • Node.js
    • Seat maps
  15. A local API proxy that forwards and logs requests across Anthropic, OpenAI, Groq, and Google AI, with a dashboard for spend by model, project, and day.

    • Python
    • API proxy
    • Analytics
    • Local-first
  16. A mobile-first expense tracker with receipt scanning, budgets, and family sharing. Scan a receipt and it fills the amount, category, and merchant; the budget updates live and the shared picture compounds with every scan.

    • React Native
    • AI
    • Finance
    • Mobile
  17. A local-first notes app with a live knowledge graph. Notes connect automatically by semantic similarity, so you can watch ideas cluster in real time. Built for thinking, not filing.

    • React
    • TypeScript
    • D3.js
    • Vector search
  18. AI-assisted project planning for engineering teams. Decomposes high-level goals into executable plans with Monte Carlo risk simulation, critical-path analysis, and circular-dependency detection across Agile, Shape Up, Waterfall, and Kanban.

    • React
    • TypeScript
    • Zustand
    • IndexedDB
  19. A lightweight inference router that dispatches prompts to different Ollama models by task: code to a coder model, reasoning to a larger one, quick answers to a small one. Zero cloud, full control.

    • Node.js
    • Ollama
    • Local LLM
    • Routing
  20. A production-grade development framework for Claude Code covering the full software lifecycle, from architecture and testing to deployment. Skills, specialist agents, and slash commands that work together out of the box.

    • Prompt engineering
    • Framework design
    • DevOps
    • Claude Code

The operating system

Business school taught me to ask why. Building taught me to finish. I work best where product judgment, technical curiosity, and a bias toward shipping overlap.

I'm Abhi Poluri, an SFU BBA student in Vancouver. My projects range from local-first AI tools to planning products and mobile apps.

I also built a profitable retail-arbitrage operation from zero startup capital. Different medium, same instinct: understand what matters and close the loop.

Based in
Vancouver, Canada
Studying
Strategy & entrepreneurship
Looking for
Product and technology internships

Word forge

Build the invitation.

Load all three materials into the forge. They're the combination I bring to internships, collaborations, and hard product problems.

Drop materialDrop materialDrop material
0 / 3 LOADED

Feed the machine.

Use Product, Strategy, and Code

There are two keyboard secrets hidden on this page.