Cursor AI Pricing 2026: Is It Worth $20/Month?

Cursor AI pricing has become one of the biggest developer discussions
in 2026. With the Pro plan at $20/month, is it actually justified —
or is the free tier good enough?

Free vs Pro: What You Actually Get

Free (Hobby) Plan:

  • 2,000 code completions per month
  • 50 slow premium model requests
  • Basic AI chat
  • No priority access to faster models

Pro Plan ($20/month):

  • Unlimited code completions
  • 500 fast premium model requests (GPT-4, Claude, etc.)
  • Unlimited slow premium model requests
  • Priority access to frontier models
  • Advanced codebase indexing

If you’re using Cursor professionally, you will hit the free tier
ceiling fast. The question isn’t if you’ll need Pro — it’s whether
it’s priced fairly.

How Cursor AI Cost Compares in 2026

GitHub Copilot — $10/month

  • ✅ Half the price
  • ✅ Deep IDE integration across VS Code, JetBrains, Neovim
  • ❌ Chat experience is weaker than Cursor
  • ❌ Multi-file editing lags behind

Windsurf (formerly Codeium) — Free + $15/month Pro

  • ✅ Strong free tier, cheaper Pro
  • ✅ Agentic “Cascade” feature is impressive
  • ❌ Smaller model selection
  • ❌ Still maturing in stability

Zed + AI — Free with usage-based costs

  • ✅ Blazing fast, pay-as-you-go
  • ❌ Less polished AI experience

The takeaway: Cursor is the most expensive option — and the one
most developers with serious workloads keep coming back to.

Is Cursor AI Worth It? The Real-World Case

Worth it if:

  • You write code professionally and bill for your time — if Cursor
    saves 1-2 hours per week, it pays for itself
  • You work across large codebases where codebase indexing matters
  • You use AI chat heavily during development
  • You work across multiple languages or frameworks

Not worth it if:

  • You’re a hobbyist with occasional projects
  • Your workflow is boilerplate-heavy with simple patterns
  • You’re deep in a JetBrains ecosystem

The hard number: Cursor Pro costs $240/year. For a professional
developer, that’s less than two hours of billable work.

Should You Upgrade to Cursor Pro in 2026?

Yes — for professional developers, with one caveat.

The caveat is the fast request limit. 500 fast premium requests
sounds reasonable until you’re running extended agentic sessions.
2026 has seen more competition in this space, which tends to push
features up and prices sideways.

The bottom line: $20/month is fair for what Cursor Pro delivers.
Not cheap compared to every competitor, but not expensive relative
to what it replaces — slower development, more context-switching,
and constant tab-juggling.

Still deciding? Our
Best AI Coding Assistants in 2026
guide breaks down every major option.

If you’re still on the fence, start with the free tier. You’ll know
within a week whether you’ve hit the ceiling.

Full breakdown at The Dev Brief

The Brilliant Person in Your Pocket

AI Edge Gallry App- Gemma 4 Use cases

What Gemma 4 taught me about the real future of on-device AI, and why I owe Seyi an apology

This is a submission for the Gemma 4 Challenge: Write about Gemma 4

I poured cold water on an intern’s excitement about a powerful AI model that could run entirely on a phone. That was a few weeks ago, and now, I am the intern.

Let me explain – Seyi is a mechatronics student at Bells University, Nigeria, doing an internship at my workplace. He came in buzzing one morning about Gemma 4, Google’s latest open-weight language model, capable of running completely offline on consumer hardware. His eyes were wide, but mine were narrower. My internal monologue went something like: Why would I want to downgrade to a local model when I have cloud access to far more powerful ones? Privacy concerns didn’t register for me. Usage limits weren’t a real problem on my Google One plan, and an offline model, by definition, is frozen in time, limited to whatever it knew at training.

Where’s the upside, I asked?

I said all of this out loud. Seyi nodded, deflated, and went back to his desk. The universe, as it often tends to do, had a rebuttal scheduled for later that week.

The Argument I Didn’t Expect to Lose

A few days later, I was browsing Martin Sauter’s blog (he’s a telecom author whose book remains one of my favourites), and I check in occasionally even when the content goes well over my head. He’d started a thread on running local AI: terms like OpenWebUI and RAG were being thrown around, discussions about making offline models more dynamic through external connectivity.

Something clicked in my mind. I’ve been thinking for a while about using AI for specialised tasks at work, but corporate environments don’t always play nicely with public cloud AI. Uploading proprietary documents to a public model is a legitimate concern. A capable model running on a personal device, answering to no server and leaving no data trail, was beginning to sound less like a downgrade and more like a completely different category of tool.

Then I saw a LinkedIn post about the AI Edge Gallery, an Android app from Google that lets you run Gemma 4 directly on your phone. No cloud, no subscription, no data leaving the device.

That was it for me. I was in.

More Than a Chatbot in Your Pocket

Before we go further, let me quickly explain what Gemma 4 on AI Edge Gallery actually is, because it is not simply “a smaller ChatGPT that works offline.” That framing undersells what’s actually available here. While Gemma 4 comes in four variants, two of them are light enough to run on a phone: the E2B, optimised for speed on mid-range devices, and the E4B, a smarter model targeted at modern phones with 8GB of RAM or more. I run a Google Pixel 8 Pro with 12GB of RAM, so the E4B was my lane.

The Edge Gallery app itself organises Gemma 4’s E2B and E4B models’ capabilities into distinct workspaces. There’s AI Chat with Thinking Mode, which shows you the model’s step-by-step reasoning in real time (a genuinely useful window into how it arrives at answers). There’s Ask Image, which lets the model read and analyse photos from your camera or gallery, entirely offline. There’s Audio Scribe for transcription and translation. And then there’s Agent Skills, the feature that consumed most of my attention.

AI Edge Gallry App- Gemma 4 Use cases

Agent Skills are best explained with an analogy. Gemma 4 out of the box is a brilliant person who can hold a nuanced conversation. Skills are what you hand that person before the conversation starts, like a calculator, a specialist reference manual, or a set of behavioural instructions. The model reads a menu of available skills at the start of each session, determines which one is relevant to your request, and activates it. The core file that defines each skill is called a SKILL.md — a plain text document with a metadata block at the top (a name and a trigger description) and freeform instructions below (text-only skills). No coding required. Anyone who can write clearly can, in theory, build a custom AI skill.

That word “in theory” is pushing it a bit. More on that shortly.

My First Experiment: Teaching Gemma to Write Like Me

As a telecom professional who writes about the industry, I run a LinkedIn newsletter called Signal Over Noise, and my first instinct was to test Gemma’s ability to replicate my writing style. Not to replace my writing, but to see if a local model could serve as a personal writing assistant, one that knows my voice well enough to be actually useful when I hand it raw material to reshape.

Teaching Gemma to write

The process of building the skill itself was fascinating. I worked with Claude to do a detailed stylistic analysis of my previous non-AI-assisted articles, creating twelve touchpoints covering voice, rhythm, structure, openings, analogies, vocabulary, signature moves, and more. The analysis surfaced consistent fingerprints: the conversational-analytical blend, the personal entry point as a default opening, the pop-culture analogies with Nigerian context, invented compound words, and the self-aware aside that steps just outside the narrative. That profile became a SKILL.md file – my personal, reusable, installable instruction set that could theoretically rewrite any source material in a documented style, calibrated by adherence level.

Then I tried to run it. And Gemma 4, to its credit, was very honest about its limitations.

Three Lessons From a Phone That Crashed, Looped, and Gave Up Mid-Sentence

Lesson One: Instruction Footprint Matters More Than You Think

The first time I tried to activate my style skill on the E2B and E4B variants, the app crashed immediately. Not “it gave a bad output.” It crashed repeatedly.

The root cause, as I later understood it, is that local models operate within strict, hardware-enforced RAM allocations. The original instruction file was verbose: exhaustive descriptions for every adherence level of all twelve style touchpoints. Before the model could process a single user message, the system had to load all of those instructions into its working memory. The sheer volume saturated the phone’s RAM allocation before the engine could even initialise, and the application stopped working.

RAM Overload

The fix was aggressive compression, stripping the descriptive matrices, keeping only the core tenets, reducing the file by roughly 60%, and bringing the system-level instructions under the memory threshold. It worked, sorta. The app stopped crashing.

But this was also the first clear signal: cloud-model habits do not translate to mobile hardware.

Lesson Two: Structured Instructions Apparently Confuse Small Models?

With a leaner file, the skill loaded. But when I prompted it to rewrite a long technical article on 5G network architecture, the model didn’t write anything. It produced this instead:

<|tool_call>call:run_intent{intent:"dabs-style-rewriter", parameters:{"Source Material": "..."

The model had looked at an instruction file formatted with numbered steps, labelled inputs, and a structured schema and concluded it was not a writing persona but an API gateway. It was trying to route data to another application that didn’t exist. Instead of channelling a writer’s voice, it was behaving like a function router.

Confused by highly structured instructions...

The solution was to flip the entire framing from “Steps and Inputs” to “Be this person immediately.” Move away from programmatic structure, toward a pure system instruction that establishes persona from the first line. The model responds to being told who to be far better than it responds to being told what to do in sequence.

Lesson Three: Small Models Have a Working Memory Ceiling…and It Shows

With the condensed, persona-first version of the skill, I finally got output. But it didn’t quite sound like me, and it stopped mid-sentence abruptly. What was happening, as best as I can understand it, is context exhaustion, i.e., the model’s working memory (its KV cache, if you want the technical term) was completely filled by the combination of the instruction file and the dense 700-word 5G article I’d handed it as source material. With no computational overhead left to manage, it began to stutter, outputting typographical duplicates like “all the* the*”, before hitting its timeout and cutting out entirely.

Memory Cap

This is the fundamental gap between a local mobile model and a large cloud LLM. A cloud model can hold hundreds of complex rules, a dense technical source, and an elaborate creative brief simultaneously and produce something nuanced that balances all of them. A 4-billion-parameter model on a phone cannot. Not even close. The reasoning gap is not a flaw to be patched in a software update; it just a consequence of physics and silicon.

So What Are Small Local Models Actually Good For?

Here is the reframe that changed how I think about all of this and, I’d argue, the more interesting question…

Forcing a small local model to perform complex creative persona replication is the wrong brief entirely. It’s like hiring a specialist fabricator to write you a novel. The skills aren’t absent; they’re just misallocated.

What local mobile models genuinely excel at is structured data, deterministic rules, and zero-hallucination utility work. They are fast, private, and always available. The question isn’t “can they replicate a cloud model’s creative output?” The question is “what tasks benefit from a local, lightweight, always-on intelligent layer?”

ILocal LLM on mobile as a key utility

One practical answer I landed on came from my own life. I use a solar-powered inverter setup at home. Managing backup power means keeping an eye on cloud cover, grid stability, and battery load, and I sometimes have to call my wife from work to ask her to check conditions and act accordingly. How about trying out a JavaScript-enabled Agent Skill on my phone, which could probably handle it elegantly.

Here’s how: JavaScript Skills (as opposed to text-only skills, earlier described) give the AI the ability to actually execute code within a hidden browser environment on the phone. The model’s job is reduced to one thing: capturing the user’s natural language input, like a neighbourhood name.

A script then takes that variable, calls a live weather API, retrieves real-time cloud cover data, applies the relevant electrical formulas within JS, and returns a plain-language recommendation. “Turn on the deep freezer. Solar output is adequate.” No creative reasoning required and no hallucination risk. The AI is the natural language interface; the code is the engine.

That division of labour, model as conversational intake and code as execution layer, in my opinion, is where mobile AI actually earns its keep.

What This Means for the Bigger Picture

Step back for a moment and consider what is actually happening here. A model capable enough to understand nuanced instructions, hold a meaningful conversation, and trigger appropriate specialised behaviours, all without sending a single byte of your data to any server, now fits inside a device you carry in your pocket.

That is not a minor development.

The immediate practical implications are clearest in environments where cloud AI is restricted: corporate networks, regulated industries, and low-connectivity regions. For anyone in those categories, Gemma 4 on a capable Android phone is not a compromise. It’s the first viable option. And for the African context specifically, where data costs remain non-trivial, and cloud latency is a genuine UX concern, the case for capable on-device inference is stronger than it might appear from a high-bandwidth Western baseline.

AI in your hands

But the more interesting implication is what it signals about the direction of travel. The bottlenecks I encountered (memory saturation, intent looping, context exhaustion) are real, but they are also well-understood engineering problems.

Model quantisation is getting better. Mobile hardware is also improving. The techniques for writing efficient, structured skills that play to a local model’s strengths rather than fighting its limitations are learnable, and they’re becoming more documented. The floor on what a phone-based AI can do in 2026 is already higher than most people realise. In a few years, the question won’t be whether it’s capable enough, but whether the existing and popularly used cloud model is offering you enough additional value to justify the dependency.

I am not suggesting local models will replace cloud AI. That would be a lazy take, and I’ve already used up my quota of lazy takes in this article (see: Seyi, opening paragraphs). What I am saying is that the role of on-device AI is transitioning from novelty to infrastructure, from “cool demo on a tech blog” to a genuine utility layer for people who need private, fast, and accessible intelligence built into their workflows.

Closing Thoughts: Seyi Was Right

The arc of this whole experiment (from skeptic to cautious convert) tracks almost perfectly with how genuinely disruptive technologies tend to arrive. Not with an obvious, immediate use case that justifies the hype, but with a quiet accumulation of practical realisations that eventually tip into “oh, this is actually something.”

My style-replication skill didn’t work the way I hoped. The model crashed, looped, and truncated. But in failing those tests, it showed me exactly where its real value lies, and gave me a concrete mental model for building agent skills that actually perform. The solar power assistant is on my list. A RAN architecture reference tool for work is also on the list, one that accepts base station design inputs and returns equipment specifications based on local rules, privately, offline. These are not glamorous AI use cases. They are, however, genuinely useful ones.

On-device AI is not the future of AI. It’s the future of how AI fits into ordinary life – quiet, local, and practical, like a good tool should be.

Seyi, if you’re reading this: I owe you one.

Why your Claude API bill is 3x what it should be (and how to fix it)

TL;DR: I audited a friend’s startup that was spending $4,200/month on Claude API. Only $1,300 produced business value. The other $2,900 was waste — split across three patterns that hit most teams using LLM APIs in production. Here’s how to find them in your own bill, and the code to fix each one.

The audit

A friend running a B2B doc-summarization product asked me to look at their Claude bill. Q1 was $4,200/month and climbing. We pulled their request logs into a spreadsheet, classified each call by purpose, then estimated what each should have cost. The answer was uncomfortable:

Bucket Cost Producing business value?
First-time doc analysis $890 Yes
User chat turns $410 Yes
Repeated system prompts (no cache) $1,810 No
Opus calls that should be Sonnet $680 No
Serial bulk runs (should be batched) $410 No

Three problems, $2,900/month of waste. Each one is unsexy and easy to miss, but together they were 70% of the bill.

Culprit #1: prompt caching is off

This is the silent killer. Claude 4.x supports prompt caching: send a 5-minute or 1-hour TTL cache_control block, and Anthropic charges you ~10x less for cached tokens on subsequent requests. Pricing today (per million tokens for Sonnet 4.6):

  • Fresh input: $3.00
  • Cache write: $3.75 (one-time, slightly more than fresh)
  • Cache read: $0.30 — 10x cheaper

The catch: you have to opt in per-request, and most code doesn’t. Before/after:

# Before — every call pays for the full system prompt
client.messages.create(
    model="claude-sonnet-4-6",
    system="You are an expert at...[2000 words of rules + examples]",
    messages=[{"role": "user", "content": user_input}],
    max_tokens=1024,
)
# After — system prompt cached for 5 minutes
client.messages.create(
    model="claude-sonnet-4-6",
    system=[
        {
            "type": "text",
            "text": "You are an expert at...[2000 words of rules + examples]",
            "cache_control": {"type": "ephemeral"},
        },
    ],
    messages=[{"role": "user", "content": user_input}],
    max_tokens=1024,
)

One-line change. 90% discount on every subsequent call within the cache TTL.

For my friend: 20K tokens of system prompt × 8 requests/min × 50% cache hit ratio = ~$80/day saved. That alone was $2,400/month — most of the $1,810 leak.

OpenAI SDK calling Claude (via compatible proxies) has equivalent semantics:

client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[...],
    prompt_cache_key="user-session-12345",  # Stable across calls = cache hit
)

Action: open your last week of API logs. If you have any repeated system content across requests, you’re leaking.

Culprit #2: model overkill

The mental shortcut “Claude = quality, just always use Opus” is expensive. Opus is 4x the cost of Sonnet for inputs, 5x for outputs. For a lot of work, Sonnet or even Haiku is indistinguishable.

I ran 5 tasks across the lineup (1000 samples, scored by judge model + human spot-check):

Task Opus 4.7 Sonnet 4.6 Haiku 4.5 Best price/quality
JSON extraction from PDFs 99.2% 98.7% 96.4% Haiku
Code review (real bugs) 74% 74% 61% Sonnet
Creative copy (blind judged) 51% pref 48% pref 32% pref Sonnet
Multi-step reasoning chain 89% 76% 54% Opus
Customer chat 92% sat 89% sat 81% sat Sonnet

The pattern: Opus wins clearly only on complex multi-step reasoning. For most tasks Sonnet is within margin of error at 1/4 the cost. Haiku trades 2-5% accuracy for 1/13 the cost — fine when you have downstream validation.

My friend was running every doc through Opus by default. Switching to Sonnet for analysis + Haiku for tagging dropped that bucket from $680 to $140. No quality complaints.

Action: pick the 3 most expensive endpoints in your bill, A/B-test them on the next cheapest model for a week, score outputs blind.

Culprit #3: serial calls when you could batch

If your work doesn’t need a response in the next 30 seconds, the Anthropic Message Batches API charges half price with a 24-hour SLA. Same models, same quality, half the bill.

Good fits:

  • Nightly summarization runs
  • Classifying or tagging large datasets
  • Embedding generation for indexing
  • Internal report generation
  • Training data prep

Bad fits:

  • Anything user-facing (you’ll wait hours)
  • Anything where input depends on previous output
batch = client.messages.batches.create(
    requests=[
        {
            "custom_id": f"doc-{doc.id}",
            "params": {
                "model": "claude-sonnet-4-6",
                "max_tokens": 1024,
                "messages": [{"role": "user", "content": doc.text}],
            },
        }
        for doc in docs
    ],
)

# Poll until done (or just check tomorrow)
while batch.processing_status != "ended":
    time.sleep(60)
    batch = client.messages.batches.retrieve(batch.id)

My friend had a nightly job re-summarizing all docs from the previous 24h. Moving it from asyncio.gather to batches cut that bucket from $410 to $205, no user-visible impact.

Action: any cron job, weekly report, or async task hitting your LLM API — most can be batched.

The result

After three changes (cache hint, model rebalance, batch the async work), my friend’s monthly bill went $4,200 → $1,540. Same product, same quality, no rewrites — just turning on features the API already supports.

If your bill feels high, do the same audit:

  1. Pull last 30 days of API calls
  2. Count distinct system prompts. <10 unique but >10,000 calls = no caching
  3. Look at top 5 model+endpoint combos by spend. Anything simple enough to downshift?
  4. Find your largest single-day spike. Batch job? Use the batches API.

A shortcut, if you don’t want to instrument all this

I built a little proxy called MidRelay that handles the first two automatically: it injects a per-key cache hint into every request (even SDK code that doesn’t know about cache_control gets the discount), and it exposes both OpenAI and Anthropic surfaces from the same key so you can route model-by-model without rewriting.

It also happens to be 60-80% cheaper than calling Anthropic / OpenAI directly. (Same models, same wire protocol — your existing SDK just changes the base_url.)

$5 of free credit to test it: drop a comment, I’ll DM a code. First 100 readers, no signup gate.

But honestly — the techniques above work on any provider. Even if you never touch MidRelay, just turning on cache_control and downshifting one over-spec’d Opus call will cut your bill more than any “AI cost optimization” SaaS will.

Check your logs tonight.

Why I Built My Own AI Project Management Assistant – and What I Learned

AtlasMind Demo

After decades of managing software programs across different industries, I still found myself spending hours each week writing JQL to get my reporting ready. Every project management tool I have worked with is excellent at storing data and painful at visualizing it. Jira is the best of them. It is still painful. The more you start exploring, the more knowledge and skills one needs to adapt to get a valuable result out of it. And even when you got the data, you still had to turn it into something a stakeholder could read, the right chart, in the right format, without a tutorial. Different reports for different audiences with variety of charts, everyone needed a different view of the same data.

Should I export the data to excel create a pivot table and then generate the chart, or should I use the dashboard reports manually creating each types of charts and linking with the right table, or should I use another custom tool provided by a third party vendor, choices are many but integration efforts and future reliability would be a question and pain. Another daunting topic would be to know how to query using various kinds of query language JQL, SQL or mdx or so on.

To overcome all these problems, I turned to AI, offloading all heavy lifting onto AI and focused on letting it generate the charts or tables with the right query. This is what the AtlasMind tool does, give a question in plain English about your project and you get charts rendered with tables that can be easily filtered and used for your reports with just a click of a button.

AtlasMind is live at atlasmind.de. It runs live against the public Apache jira server. Here is what it looks like in practice.

User : show me all open bugs in project Kafka ordered by priority

JQL    : project = KAFKA AND issuetype = Bug 
         AND status not in ('Closed', 'Resolved') 
         ORDER BY priority DESC

Ai Answer : Open bugs in Kafka project ordered by priority.
         Found 2170 result(s); showing 1000.

 

Live: https://atlasmind.de
Frontend: https://github.com/sunishbharat/AtlasMind-frontendUI
Backend: https://github.com/sunishbharat/atlasMind-Lite

 
AtlasMind Demo

Type a question in plain English. Get JQL, a chart and an answer in seconds.

Architecture

Query router: It classifies the user query into 3 paths, general pipeline, JQL pipeline or direct chart rendering.

RAG pipeline: when a query is classified as JQL, it follows the RAG pipeline. The system uses Sentence Transformers and pgvector libraries to store the JQL annotations, jira fields, associated values as embeddings. At query time, the user’s question is embedded and compared against stored vector embeddings. Pulls top 5 nearest neighbors using L2 distance between the query and the jira fields available.

LLM Orchestrator: This layer acts as the backend switch to an active backend of the systems choice like Groq, ollama, claude etc. Each backend is a separate async client module.

Self-correcting JQL loop: Before the LLM generated JQL reaches the Jira API, it goes through a 7-pass sanitizer. These seven passes manage the most common LLM failure modes without any LLM call which makes the system more robust. After sanitization, the JQL is regenerated by LLM and is executed against the Jira REST API. This is where the agentic feedback loop begins. The loop runs up to n number of retries. When Jira identifies a specific invalid field by name, the prompt tells the LLM to remove that exact field condition and not to guess or hallucinate any fields. This surgical assertion makes the LLM generate a very deterministic JQL which is valid.

Multi-backend architecture: Why I decided on multi backend is for easy design and usage. During my initial development phase, I built the initial version using local LLM model Ollama with zero cost, zero API tokens, zero cloud dependency. Later I extended it to support other limited/free models which was much better in performance and JQL generation quality.

Deployment: AtlasMind runs on Oracle cloud Infrastructure A1 instance with PostgreSQL + pgvector, Groq (default), Ollama (fallback), and the frontend. This instance hosts everything FASTAPI backend, postgresSQL, Ollama as the local inference fallback and the Svelte frontend. For better performance and heavier inference, there is also support to run on local GPU system running vLLM with quantized 7B Qwen2.5-Coder model over HTTP. When GPU system is off, AtlasMind falls back to local Ollama automatically with no configuration change or restart required.

What I Learned

  • I have not load tested AtlasMind under concurrent users at scale. Likely bottlenecks are pgvector query time under high vector search volumes. Jira API rate limits under parallel requests and LLM inference latency under load. These are unknown problems and honestly for a side project built during evenings and weekends, discovering these problems is a real challenge.

  • One important distinction is that the LLM model is still not fully capable of generating a JQL on its own, multiple trial and errors with surgical assertions still do not make it fully dependable. Fine-tuning with the specific Jira instances would get the JQL generation accuracy significantly higher.

  • Implemented entirely raw without using Langchain or Langgraph libraries, I deliberately built the RAG pipeline and agentic loop from scratch to understand what was happening under the hood. I am equally interested to see if the result changes when used with standard libraries.

AtlasMind is what I wish existed across every programme I have ever run. I built it to prove that the gap between Engineering execution and project intelligence can be closed.

Live: https://atlasmind.de
Frontend: https://github.com/sunishbharat/AtlasMind-frontendUI
Backend: https://github.com/sunishbharat/atlasMind-Lite

What should happen when a repo does not run?

Ota doctor in practice

Most repos still fail in a strangely manual way.

You run a command.
It breaks.

Now you have to reverse-engineer the repo:

  • read the error
  • search the README
  • inspectpackage.json, Docker files, and lockfiles
  • compare local state with CI
  • ask someone who already knows
  • try a few fixes and hope one is the real one

That is annoying for developers, but it is a bigger problem now that AI agents are being asked to work inside unfamiliar repositories.

If an AI agent is told to fix a bug, it first needs a reliable answer to some basic operational questions:

  • What does this repo require to run?
  • Which workflow is the intended front door?
  • Which missing dependency is actually blocking readiness?
  • Which commands are safe to run?
  • What should stop progress vs what is only a warning?

In most repos, those answers are spread across docs, scripts, CI config, and tribal knowledge. That means the agent is not operating from repo truth. It is guessing. That is the problem ota doctor is meant to solve.
ota doctor evaluates a repo against its readiness contract, defined in ota.yaml, and reports:

  • whether the repo is ready
  • what is missing
  • what is blocking readiness
  • what is only degraded or advisory
  • the next safe action to take

So instead of “command failed, go investigate the repo,” you get a structured readiness diagnosis.

For maintainers, that means fewer contributors rediscovering the same setup failures from scratch.

For contributors, it means less time spent diffing docs against reality.

For AI-assisted development, it gives the agent an operational signal before it starts making changes in a repo it does not yet understand.

The broader question is simple:
When a repo is not runnable, what should it say, and how explicitly should it say it?

My view is that “good luck, read the repo” is no longer good enough.

Ota doctor in practice

If you want to pressure-test that idea on a real codebase, try Ota and see what ota doctor surfaces:
https://github.com/ota-run/ota

I built LET — a local-first habit and life-events tracker in React Native

I’ve been building side projects for years. most of them live on github, quietly collecting dust. LET is one i actually use daily.

LET (Life Events Tracker) is a React Native + Expo app for tracking habits, mood, and life events — entirely offline, no account required, no data leaves your device.

the problem with most habit trackers

they want your data. subscriptions, cloud sync, accounts. i wanted something simpler: log what happened today, see patterns over time, own the data. so i built it.

the stack

piece why
React Native + Expo iOS, Android, and web from one codebase
NativeWind TailwindCSS for RN — familiar syntax
Zustand minimal state, no boilerplate
expo-sqlite + Drizzle ORM type-safe local SQL, migrations run on device
Expo Router file-based navigation like Next.js
Custom SVG charts hand-rolled paths, no heavy chart lib

what it does

four main modes: daily habit tracking (with custom event colors), mood logging, life milestone recording, and a pattern view that surfaces weekly trends from those custom SVG charts.

data export/import is JSON, dark/light mode is fully supported, and swipe navigation works throughout.

the part worth talking about

this whole app was built through vibe-coding — describing features in natural language, iterating with AI, spending mental energy on product decisions instead of boilerplate.

it is not a toy. the codebase has proper navigation with expo-router, accessible UI atoms via rn-primitives, and a schema-first SQLite setup with Drizzle that runs migrations at startup. just built through a different workflow.

links

LET on GitHub

https://github.com/p32929/let

live web demo: https://p32929.github.io/let/

would love honest takes on what is missing or clunky. stars and forks appreciated if it is useful.

open to building with sharp teams and solo founders — dms and email open.

The “AI Native Builder” Role is Here (But Companies Don’t Know How to Hire You)

If you were building with AI back in 2024, people thought it was a crutch. Today, it’s the most in-demand skill in the startup world.

I’ve been interviewing a lot lately, and there is a massive shift happening. Startups are desperate for developers who can just sit down and ship an MVP in a week using AI.

But there is a huge disconnect in how these companies are hiring.

The Problem: Wrong Titles, Wrong Platforms

Startups know exactly what they want, but they are doing a terrible job finding it.

  1. The titles are wrong: These jobs are impossible to search for because they use generic titles like “Software Developer” instead of anything AI-specific.
  2. The JDs are bad: HR usually just copies and pastes old corporate requirements that have nothing to do with the actual job of “just ship it with Claude.”
  3. They search in the wrong places: Companies post these roles on traditional, corporate job boards like LinkedIn and Indeed. But the scrappy builders they actually want to hire aren’t there—they live on X, Reddit, and dev communities.

What They Actually Want

When you ignore the bad job descriptions and actually talk to the founders, the real requirements are simple:

  • No Corporate Engineers: They don’t want people who need daily standups, multiple PMs, and weeks of planning.
  • Degrees don’t matter: They do not care if you have a CS degree or if you used to work at Google.
  • Show Your Work: The only thing they care about is seeing a real project you built from scratch.
  • High Autonomy, Good Pay: You are given a goal, not a ticket. You work independently, and because you do the work of three people, the salary is very good.

Bridging the Gap

It is exhausting trying to filter through the noise on Indeed just to find a team that gets it. Startups are frustrated they can’t find builders, and builders are frustrated they can’t find these roles.

So I decided to fix it. I built AI Native Builder.

It’s a simple, curated job board just for this. No corporate red tape, no arbitrary degree requirements. Just jobs for people who build and ship with AI, placed where builders actually hang out.

If you just want to build, stop looking at the standard job boards.

Selling Online Courses Without Platform Lockout: The Crypto Fix That Ultimately Fails

The problem we were actually solving,

We’re a small team of software developers in a country where popular online platforms like PayPal, Stripe, Gumroad, and Payhip are blocked. Our online course platform, which we’d built using Ruby on Rails and PostgreSQL, was facing a major hurdle: we couldn’t receive payments from our customers. I was tasked with finding a solution that would allow us to sell our courses without relying on these restricted platforms.

What we tried first (and why it failed),

When we first encountered the restrictions, our instinct was to look for workarounds within the existing platforms. We tried using third-party payment gateways that promised to bypass the restrictions, but these solutions turned out to be flimsy at best. We’d spend hours setting up these gateways only to be locked out again a few days later, with no clear reason as to why. These attempts also introduced a significant amount of technical debt, as we’d have to constantly update our code to accommodate the shifting requirements of these third-party gateways. The technical complexities and maintenance nightmares made us realize that these workarounds weren’t sustainable.

The architecture decision,

After exhausting our exploration of platform-based solutions, we turned to a more unconventional approach: using cryptocurrency to facilitate payments. We researched various cryptocurrency payment processing services like Bitpay and Coinbase Commerce, which allowed us to integrate a payment gateway directly into our course platform. We used a combination of these services and some clever routing logic to create a seamless payment experience for our customers. Our platform would redirect customers to a cryptocurrency payment page, where they could fund their purchases using their preferred cryptocurrency.

What the numbers said after,

At first glance, our new cryptocurrency-based payment system seemed to be a hit. Our course sales began to rise, and we were finally able to reach customers in restricted countries. However, as time went on, we encountered a new set of problems. Our analytics showed that the vast majority of our customers were using cryptocurrency because they had no other choice, not because they preferred it. We saw a significant increase in abandoned checkouts, likely due to the steep learning curve and uncertainties associated with cryptocurrency transactions. Our revenue growth started to slow down, and we realized that our reliance on cryptocurrency was creating more problems than it was solving.

What I would do differently,

In hindsight, I would explore alternative payment methods that don’t rely on traditional platforms. Our research should have started with services like Mollie, Rapyd, or even PayPal’s own “Instant Transfer” feature, which can help bypass some of the restrictions. These services often have better support and fewer restrictions than the more well-known payment platforms. By exploring these alternatives, we might have avoided the complications associated with cryptocurrency and created a more stable and user-friendly payment experience for our customers. Ultimately, our decision to rely on cryptocurrency highlights the importance of understanding the complexities of platform restrictions and the trade-offs associated with unconventional solutions.

Forward Settlement: how a trading agent locks tomorrow’s price without a clearinghouse

A trading agent agrees a price at 9am. Delivery is tomorrow. For the 24 hours in between, somebody is exposed: either the price moves and one side wants out, or one side simply doesn’t show up to settle.

This is the oldest problem in market structure, and traditional finance solved it a long time ago — with a clearinghouse. A forward contract works because a central counterparty stands between the two parties, holds margin, and guarantees that the trade completes even if one side fails.

That solution doesn’t transfer cleanly to autonomous agents. If you’re building agents that trade — on top of an MCP server, inside a framework like LangChain or CrewAI, wherever — you eventually hit a case where the agent needs to commit to a trade now and settle it later. And the moment you reach for a forward, you’ve reintroduced exactly the trusted intermediary the rest of your stack was designed to avoid.

There’s a way to get the forward without the clearinghouse. It’s worth walking through, because it’s a small idea with a large consequence.

What a forward actually needs

Strip a forward down to its mechanics and it asks for three things:

  1. A price, fixed now. Both parties agree terms today.
  2. A delivery window, in the future. Settlement happens at T+24h, T+48h, or whatever the two sides picked.
  3. A guarantee that both legs complete — or neither does. If one side vanishes, the other must not be left holding a half-finished trade.

The clearinghouse exists almost entirely to provide #3. It is a very expensive, heavily regulated answer to one question: who makes the trade whole if a counterparty fails?

For two agents on two different chains with no shared venue, that question has no good custodial answer. A centralized desk means both agents now trust the desk — and the desk can freeze, fail, or front-run. A bridge means trusting an optimistic settlement model: most bridges assume the far side will be made whole and rely on challenge windows to catch it if not. “Probably settled by tomorrow” is not a forward.

Why the naive on-chain version fails

The first instinct on-chain is to write an escrow contract. Agent A deposits the asset, the contract holds it until the delivery time, then releases it to Agent B against payment.

Look closely at “the contract holds it.” Who can upgrade that contract? Who holds the admin key? Who decides what happens if the delivery oracle disagrees with one party? Every one of those questions is a custodian wearing a smart-contract costume. You haven’t removed the trusted party — you’ve renamed it.

The fix is not a better escrow contract. It’s to remove the holding step entirely.

The HTLC as a forward

A hash time-locked contract (HTLC) binds both legs of a trade to the same cryptographic secret and a timelock. The standard description of an HTLC emphasizes the atomic property: either both sides settle against the secret, or both sides refund after the timeout. No party can take one leg without releasing the other.

The piece that turns an atomic swap into a forward is the timelock itself. The timelock is not just a safety hatch — it is a programmable delivery window. Set it to 24 hours and you have described a T+24h forward in one parameter. Both legs are funded now, at the agreed price. Settlement can occur any time inside the window. If the window closes with the trade incomplete, both sides independently refund. No counterparty can be left exposed, because no counterparty was ever holding the other’s asset — the contract logic was.

That gives you all three things a forward needs:

  • Price fixed now — both legs are committed at agreed terms when the contract is created.
  • Future delivery window — the timelock is the window.
  • All-or-nothing guarantee — the atomic property, enforced by the chain, not by a clearinghouse.

The delivery deadline is the part worth dwelling on. In the clearinghouse model, the guarantee is institutional: you trust that the central counterparty has the capital and the legal standing to make you whole. In the HTLC model, the deadline is enforced by the base layer. On Ethereum mainnet, the timelock is just block timestamps and contract code. Nobody — including the protocol that wrote the contract — can extend it, skip it, or quietly settle around it.

Where this fits for agents

We call this Forward Settlement, and it’s a direct extension of the primitive Hashlock Markets already runs in production: atomic settlement, live on Ethereum mainnet today. The base layer is a sealed-bid RFQ for price discovery fused with HTLC settlement, exposed to agents through a 6-tool MCP server. A forward is not a separate product bolted on — it’s the same HTLC with the timelock used deliberately rather than defensively.

The reason this matters for the agent economy specifically: agents are good at committing to future actions and bad at trusting counterparties they can’t inspect. A forward written as an HTLC plays to both. The agent commits today; the chain enforces the window; neither agent has to evaluate the other’s solvency, because solvency was never load-bearing. The trade either completes atomically or unwinds atomically.

It also composes. Because each leg is independently refundable and bound to the same secret, a forward can be one leg of a multi-leg trade — sell BTC, buy ETH, buy SUI, all or nothing — without inheriting a clearinghouse for the whole bundle.

The honest limits

A few things this does not do, because overclaiming helps nobody:

  • It does not eliminate price risk. A forward fixes a price; if the market moves, one side is worse off. That’s the trade, not a bug.
  • It does not give you margin or leverage. Both legs are fully funded up front. This is a delivery guarantee, not a credit facility.
  • Today the production settlement layer is Ethereum mainnet. Sui contracts are deployed and CLI-tested with gateway wiring in progress; the Bitcoin P2WSH HTLC is validated on signet with mainnet still pending. Forward-dated settlement is live where atomic settlement is live — which today means Ethereum.

The underlying argument is in our working paper on SSRN, for anyone who wants the formal version rather than the blog version.

If an agent can get a forward without a clearinghouse, it’s worth asking how much else in market structure was only ever a workaround for missing settlement guarantees — and how much of that an atomic primitive quietly makes optional.

Protocol: https://hashlock.markets
MCP server (canonical): https://github.com/Hashlock-Tech/hashlock-mcp

Stop Building Space Shuttles When All You Need Is a Bicycle

We’ve all been there. You join a new project, excited to look at the codebase. It’s a simple application—maybe a Todo app, a simple blog, or a feedback collector.

You open the repository, expecting a clean, straightforward structure. Instead, you find:

  • 12 different microservices.
  • A Kubernetes configuration that looks like a NASA launch manual.
  • 5 layers of abstractions (Interfaces, Repositories, DTOs, Presenters, Adapters) just to fetch a single row from a database.
  • Docker containers eating 90% of your laptop’s RAM just to run npm run dev.

All of this… for an application that gets 50 users a day.

Welcome to the era of Overengineering.

How Did We Get Here?

As developers, we suffer from what I call “Resume-Driven Development” (RDD). We don’t choose tools based on what the project needs today; we choose tools based on what looks cool on our LinkedIn profile or what Netflix uses to handle billions of requests.

We became so obsessed with scalability that we forgot about maintainability and velocity.

If it takes a junior developer three days just to set up the local environment and understand how a single HTTP request routes through twenty layers of architecture, your system isn’t “advanced.” It’s broken.

The Power of the “Boring” Monolith

There is a silent counter-movement happening right now. Senior developers who have tasted the pain of managing distributed transactions and network latency in tiny microservices are screaming: Go back to the monolith!

Building a “boring”, well-structured monolithic application using simple tools (like a clean Fastify/Node.js setup, standard relational databases, and straightforward code) gives you something a distributed system can’t:

  1. Unmatched Speed: You can ship features in hours, not weeks.
  2. Mental Clarity: You can open one folder and understand the entire data flow.
  3. Cheap Hosting: A single tiny instance on Render, Fly.io, or DigitalOcean can easily handle thousands of concurrent users if your code is efficient.

Pragmatism > Hype

Don’t get me wrong. If you are building the next Uber, Netflix, or Amazon, yes—bring on the microservices, Kafka, and complex caching layers. You earned that complexity.

But if you are starting an MVP, testing a product, or building a standard internal tool, keep it stupidly simple (KISS). Use a reliable SQLite or Postgres database, write clean functions, validate your data with Zod, protect your endpoints with a simple Rate Limiter, and get things done.

Architecture shouldn’t be a monument to your ego. It should be a tool to deliver value to the user.

Let’s Be Honest…

What is the worst case of overengineering you have ever witnessed (or accidentally built) in your career? Are we, as a community, making coding harder than it needs to be?

Drop your horror stories in the comments below! 🛰️👇