midhunpm.
All projects

Midhun P M — Case studyThursday

  • Python
  • OpenAI
  • Hypruse
  • React
  • SQLite
  • LLaMA.cpp
  • Vulkan
  • Codex CLI

The problem

Thursday started with a local-only question: could an assistant do useful work without sending every note and file through a cloud API? I already ran quantized 8B models on my Intel Arc GPU through Vulkan. I wanted that setup to do more than answer questions.

What I built

Thursday is my Linux desktop copilot. The current desktop profile uses GPT-6 Luna through OpenAI's Responses API. Local llama.cpp and other compatible providers remain configurable, with the same tools, local memory, and interface.

Its capabilities are visible in the interface:

  • Files, apps, and shell — reads and writes inside configured roots, launches apps, and runs shell commands through a denylist policy.
  • Native desktop control — an optional Hypruse bridge observes Hyprland windows, reads accessible controls, and uses cropped screenshots when text is unavailable.
  • Desktop and personal workflows — searches and reviews the web, controls Spotify, drafts Gmail, prepares Calendar changes behind confirmation, and reports live system health.
  • Task checkpoints — preserves delivered tool outcomes, exposes Stop and Resume, and pauses when a task reaches its step or time budget.
  • Personal memory review — stores user-grounded facts in SQLite, with controls to inspect, correct, or forget them. Conversation history has a separate lifecycle.
  • Voice — Edge TTS for speech out, SpeechRecognition for speech in. Optional, but talking to your machine is fun.
  • Codex project studio — turns a brief into an isolated Codex CLI session in its own workspace, with model selection and a visible Kitty terminal as the source of truth.

Two interfaces: a CLI and a React web UI over HTTP with server-sent events. The web UI shows streaming responses, tool cards, task progress, memory review, and approval prompts. Desktop entries, Hyprland hotkeys, and a Quickshell push-to-talk overlay keep it close to my normal workflow.

Tech decisions

Separate model transports, shared tools. OpenAI uses the Responses API; local llama.cpp and compatible providers retain the Chat Completions path. Provider and model selection stay configurable. The local path uses a Vulkan-enabled llama-server, which lets me run inference on my Intel Arc GPU.

Smart tool filtering. Sending every tool definition every turn eats context fast. Thursday sends only the tools relevant to the current turn, so local models receive a smaller and more useful context.

Observe, act, then check. Hypruse uses window identity and accessibility for desktop actions, with screenshots as another source of evidence. After approval, Thursday rechecks the original target before delivering the action. App accessibility varies, so uncertainty can pause a task for review.

Permissions live in the application. Filesystem tools use configured read and write roots; shell commands pass through a denylist. Remote binding requires explicit configuration and an API token. The checked-in profile reflects my personal desktop setup; the safe example keeps tighter paths and disables Hypruse.

Contained Codex workspaces. Thursday validates project names, launches Codex in a separate workspace with a workspace-write sandbox, and keeps its own provider key out of the child session. Generated work does not silently land inside the assistant source tree.

What I learned

Local models taught me to treat context as a budget. Relevant tools and tight prompts were more useful than sending the entire catalog on every turn. That lesson still applies with a cloud model, especially when screenshots and previous tool outcomes share the same request.

Memory needs evidence and a way to correct mistakes. Asking about a Spring Boot file should not become a permanent claim that Java is my favorite language. Personal facts now require literal user evidence, and the review interface lets me correct or forget them.

Task completion needs the same care. A finished model response is separate from an observed result. Checkpoints preserve what was delivered so a resumed task can continue with that history visible.

Taking it to Bengaluru

I brought Thursday to the OpenAI Codex Community Hackathon in Bengaluru in August 2026. The selection email said the organizers received nearly 2,000 applications and selected around 60 people. I was there to ship, but the conversations with other builders mattered just as much. They sharpened the question I keep asking with Thursday: how can an assistant do useful work on a computer while staying legible to the person in front of it?