{"slug": "show-hn-oynix-make-your-coding-agent-aware-of-your-whole-codebase-locally", "title": "Show HN: Oynix – Make your coding agent aware of your whole codebase, locally", "summary": "Oynix, a new developer tool launched on Hacker News, creates a local graph of a team's code, docs, tickets, and conversations so coding agents can access institutional knowledge instead of starting blind. The tool connects to 18 sources including GitHub, Jira, Slack, and Notion, and serves the graph to any agent via an MCP server. Oynix cites Uber's 2026 AI budget overspend and Salesforce's expected Anthropic spending as evidence that blind agents are costly.", "body_md": "# Nothing your team\n\ndecides is ever lost.\n\nOynix remembers everything from and helps your see, rather than start blind.\n\nThe gap\n\n## Your team's reasoning is\n\neverywhere. Your agent\n\nsees none of it.\n\nThe decision lives in a Slack thread. The rationale left with the engineer. Your agent starts every session blind, and rewrites what someone already solved.\n\n[See how it works](#how)\n\nThe cost\n\n## Blind is not cheap.\n\nIt is billed somewhere else.\n\nThe industry spent two years measuring what AI gives back. The measurements that matter now are about what it costs when it does not know what your team already knows.\n\nUber spent its entire 2026 AI budget in four months of a twelve month year, after putting Claude Code in front of roughly 5,000 engineers.\n\nUber CTO, May 2026 · The Information, via ForbesWhat Salesforce expects to spend on Anthropic this year. Asked what for, Benioff answered in one word: “Coding.”\n\nMarc Benioff, CEO · All-In podcast · May 2026His projection, not a filed figureOne two hour coding session, run by Uber’s own CTO. Engineers there average $150 to $250 a month. Power users reach $2,000.\n\nUber CTO, May 2026 · The Information, via ForbesThe buyer cannot justify it. The seller cannot absorb it.\n\nEvery one of these is the same bill in a different envelope. **The agent does not know what your team already knows, so somebody pays to tell it again, every session.**\n\n90 seconds to context\n\n## Connect once. Every agent\n\nreads the same memory.\n\nOne CLI on your own machine ties your repos, docs, tickets and conversations into a single graph, then serves it to whatever agent you already use.\n\n### Connect your sources\n\nOne tap. No tokens, no scope hunting.\n\n### The graph builds itself\n\nCode linked to what explains it. No writing.\n\n### Every agent plugs in\n\nAn MCP server. Zero tokens on our side.\n\n[Keep goingConnecting is level two of seven. Here is the rest of the ladder, and where everything else stops.](#levels)\n\nConnectors · 18 live sources\n\n## Everything your team knows,\n\nin one graph.\n\nEach connector pulls its source in and links it to the code it shaped. Six providers connect in one tap. Pick exactly which channels, spaces or drives sync.\n\n[GitHubCode](/connectors/github)\n\n[GitLabCode](/connectors/gitlab)\n\n[BitbucketCode](/connectors/bitbucket)\n\n[1-TAPJiraTickets](/connectors/jira)\n\n[1-TAPConfluenceDocs](/connectors/confluence)\n\n[1-TAPLinearTickets](/connectors/linear)\n\n[1-TAPSentryErrors](/connectors/sentry)\n\n[1-TAPGoogle DriveDocs · Sheets · Slides](/connectors/gdrive)\n\n[SlackComms](/connectors/slack)\n\n[Microsoft TeamsComms](/connectors/teams)\n\n[Microsoft 365Docs](/connectors/microsoft)\n\n[NotionDocs](/connectors/notion)\n\n[CrashlyticsErrors](/connectors/crashlytics)\n\n[FirebaseData](/connectors/firebase)\n\n[SupabaseData](/connectors/supabase)\n\n[MixpanelEvents](/connectors/mixpanel)\n\n[CleverTapEvents](/connectors/clevertap)\n\n[Files & DocsUpload · 31 types](/connectors/upload)\n\n**your tool?**\n\n[Request one](/request-new-tool)\n\nThe wiki Server only\n\n## A handbook nobody\n\nhad to write.\n\nOynix generates an engineering handbook from the graph, with every claim traced to the file, commit or thread it came from. It updates when the code does.\n\n#### Architecture\n\nThe service is four packages behind one HTTP entry point. `cmd/server`\n\nwires the router, then hands every request through middleware before it reaches a handler.\n\n**Entry point** cmd/server/main.go → ApiGateway\n\n**Hot path** ApiGateway → PaymentGateway → stripe_client\n\n**Storage** PaymentStore over Postgres, RedisClient for idempotency keys\n\n**Most connected** PaymentGateway, 17 callers across 4 services\n\n#### Auth & sessions\n\nTokens are validated with `verifyStrict()`\n\non every request. There is no lenient path, and the permissive helper was removed in March after it allowed an expired token through staging.\n\n**Session expiry** 15 min idle, 8 hr absolute\n\n**Validation** verifyStrict() only, enforced in middleware\n\n**Refresh** rotating, single use, replay is rejected\n\n**Owner** Sara, since 12 Nov\n\n#### Payments\n\n`PaymentGateway`\n\nis the only component permitted to call Stripe. Handlers never touch `stripe_client`\n\ndirectly, so retries and idempotency stay in one place.\n\n**Provider** stripe_client, wrapped, never called directly\n\n**Idempotency** Redis key per intent, 24 hr TTL\n\n**Retries** 3 attempts, exponential, 4xx never retried\n\n**Blast radius** 17 callers, 4 services\n\n#### Rate limiting\n\nRate limiting lives in middleware, not in handlers. This was decided on 12 November after a duplicated implementation caused a merge conflict in `auth/handler.go`\n\n.\n\nTwo engineers had independently added a limiter, one per handler and one global. The team kept the middleware version and deleted the handler copy. Resolution took four minutes once the earlier thread surfaced.\n\n**Location** internal/middleware/ratelimit.go\n\n**Algorithm** token bucket, per API key\n\n**Decided** 12 Nov, ENG-412\n\n#### Decisions\n\nThirty-one decisions recovered from tickets, pull request reviews and Slack. Each one keeps the thread it came from, so the reasoning survives the people.\n\n**12 Nov** Rate limiting moves to middleware\n\n**28 Oct** Stripe calls confined to PaymentGateway\n\n**6 Mar** Lenient token validation removed\n\n**19 Feb** Idempotency keys moved to Redis from Postgres\n\n#### Ownership\n\nOwnership is derived from commit history and review activity, not from a file anyone has to maintain. It changes when the work changes.\n\n**payments/** Sara, 64% of commits in 90 days\n\n**auth/** Sara, took over from John on 12 Nov\n\n**middleware/** John, 41%, shared with Priya\n\n**At risk** billing/legacy, last owner left in June\n\n#### Runbooks\n\nFive runbooks assembled from incident threads and the fixes that closed them. Each step links to the change that made it necessary.\n\n**Stripe timeout** Check idempotency keys before replaying, or charges double\n\n**429 from gateway** Token bucket is per API key, not per IP\n\n**Session drops** Usually clock skew on the refresh node\n\nAsk the graph\n\n## Ask a question. Get the\n\nexact nodes that answer it.\n\nNo paragraph of hedging. Your agent receives the subgraph, tagged with where every edge came from. Pick a question, then click any node.\n\n**Type** Person\n\n**Owns** payments/, auth/\n\n**Commit share** 64% over 90 days\n\n**Reviews** 42 pull requests\n\n**Since** 12 Nov\n\n**GitHub**\n\n*42 pull requests reviewed*\n\n**Slack**\n\n*#eng-platform, 12 Nov*\n\nConfidence\n\n## Every edge says\n\nhow it knows.\n\nOynix tags each relationship with the evidence behind it. When your agent answers from the graph, you can tell what was read from source and what was reasoned.\n\n**billing-svc/checkout.go · L112** The Razorpay branch is read straight from the code.\n\n**Why the last edge is ambiguous** Two code paths set the currency flag, and a feature flag can override both. Oynix says so rather than guessing which one wins.\n\nFound in the code. The relationship exists at a file and line you can open.\n\nReasoned from structure and naming. Usually right, worth checking before you rely on it.\n\nThe evidence points more than one way, and the graph tells you so instead of picking.\n\nThe mechanics\n\n## Context has seven levels.\n\nMost tools ship two.\n\nReading your code is the first one. It is also where almost every tool stops, because the other six require knowing things your repository does not contain.\n\n### Index\n\nRead the code as a graph rather than a folder. Every symbol, call and import, across every repo, in one structure you can walk.\n\n### Connect\n\nAttach the places the reasoning actually lives. Seventeen sources, one tap each, and the tickets, threads and docs land beside the code they explain.\n\n### Reason\n\nAnswer a question by walking across all of it at once. Not a search box over one source, but a path from a function to the argument that produced it.\n\n**charge()** retry twice before failing?\n\n### Write back\n\nPut the answer back where the question came from, so the second person to ask it never has to. A read-only graph decays. This one does not.\n\nfunc (g *Gateway) charge(ctx, amt) error {\n\n+ // Retries twice: the PSP returns 503 on cold start.\n\n+ // Decided in ENG-412 after the Nov 12 incident.\n\nfor attempt := 0; attempt < 2; attempt++ {\n\n### Presence\n\nKnow who is in this file right now, and whose work you are about to collide with. Context is not only historical.\n\n**charge()**. Your agent is about to rewrite the same function.\n\n### Skills\n\nTeach the agent how this team works, not how software works in general. The conventions nobody wrote down because everybody already knew them.\n\n*→*Money is always an integer of minor units. Never a float.\n\n*→*Any PSP call goes through the retry wrapper, never directly.\n\n*→*Schema changes ship behind a flag, and Priya reviews them.\n\n### Compound\n\nEvery session leaves the graph better than it found it. The work of explaining your codebase happens once and keeps paying. Memory, not documentation.\n\nAgents\n\n## Retrieval that costs\n\nzero tokens.\n\nOynix is an MCP server, not a wrapper. Your agent does the reasoning with its own model and its own keys. We return graph facts, so you are never billed twice for the same thought.\n\nMeasured, keyless, zero cost per query\n\nThe indexing times above are the structural pass: parsing, the code graph, the search index. All of it runs on your machine with no model and no network. Almost all of the remaining time in a full index goes to writing a plain-English description of every function, which is what lets you ask a question in your own words instead of guessing at the identifier. That step is optional, and nothing measured above needs it.\n\nLocal first\n\n## The engine runs on\n\nyour machine.\n\nBring your own model keys and your own database. Your code is parsed locally and stored where you point it. We host nothing you did not ask us to host.\n\nCloning, parsing and indexing happen on your hardware. Nothing is shipped to a hosted indexer first.\n\nYour model provider, your account, your quota. Queries go from your machine to your provider.\n\nPoint Oynix at your own graph store. The memory is yours, and it stays inside your infrastructure.\n\nServe the same graph to your whole team over your own network. A new hire asks instead of reading a year of threads.\n\n### Not sure Oynix is right for your team?\n\nAsk an AI that has read the docs, the source and the benchmark. It will tell you where Oynix fits and where it does not.", "url": "https://wpnews.pro/news/show-hn-oynix-make-your-coding-agent-aware-of-your-whole-codebase-locally", "canonical_source": "https://oynix.dev", "published_at": "2026-08-25 19:34:53+00:00", "updated_at": "2026-08-25 19:45:13.203036+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "ai-agents", "ai-infrastructure"], "entities": ["Oynix", "Uber", "Claude Code", "Salesforce", "Anthropic", "Marc Benioff", "GitHub", "Jira"], "alternates": {"html": "https://wpnews.pro/news/show-hn-oynix-make-your-coding-agent-aware-of-your-whole-codebase-locally", "markdown": "https://wpnews.pro/news/show-hn-oynix-make-your-coding-agent-aware-of-your-whole-codebase-locally.md", "text": "https://wpnews.pro/news/show-hn-oynix-make-your-coding-agent-aware-of-your-whole-codebase-locally.txt", "jsonld": "https://wpnews.pro/news/show-hn-oynix-make-your-coding-agent-aware-of-your-whole-codebase-locally.jsonld"}}