Changelog
Apa yang baru di Nexus · v0.11.0
v0.11.0Infra2026-09-15
Nexus punya alamatnya sendiri
- Semuanya pindah dari drwcorp.com. Dasbor ada di nxslabs.space, gateway API di api.nxslabs.space, dan chat di chat.nxslabs.space. Tiga alamat lama dimatikan, bukan diarahkan, jadi apa pun yang masih menunjuk ke sana berhenti bekerja.
- ⚠️ Kalau Anda memakai key di OpenCode, Cursor, Claude Code, atau kode sendiri, base URL-nya berubah. Ganti https://ai.drwcorp.com/v1 menjadi https://api.nxslabs.space/v1. Key-nya sendiri tidak berubah dan tidak perlu diterbitkan ulang.
- ⚠️ Pengguna OpenCode: jalankan ulang perintah satu baris di halaman panduan, lalu restart editornya. OpenCode membaca kemampuan model sekali saat start, jadi sesi yang sedang jalan masih memegang alamat lama sampai direstart.
- Login Google didaftarkan ulang untuk dasbor dan chat. Kalau suatu saat login memantul dengan galat redirect, bagian itulah yang pertama dicek.
- Sembilan aplikasi internal sudah dipindahkan sebelum alamat lama dicabut, termasuk jalur transkripsi CRM serta pipeline blog, berita, gym, dan portofolio.
- Gambar dan video hasil generate kini disajikan dari alamat baru. Objek yang lebih tua dari sehari memang sudah kedaluwarsa dengan sendirinya, jadi riwayat tidak terpengaruh di luar itu.
- Harga, saldo, key, dan nama model tidak ada yang berubah. Yang berubah hanya di mana layanan ini menjawab.
v0.10.3Fix2026-09-10
gpt-5.6-sol is half the price it said it was
- gpt-5.6-sol was priced at $4 and $20 per million tokens. The real rate is $2 and $10, so every request on it has been costing double what it should. Now corrected — the same balance buys twice as many tokens on that model.
- Five embedding models were priced a fraction above their real rate as well, and are now exact.
- Both were found by a new check that reads Cloudflare's own catalogue and compares it against what we charge, rather than trusting numbers typed in weeks ago. It runs on demand and will catch the next drift the day it happens.
- The check reports and stops rather than updating anything by itself. Catalogue metadata says what a model claims — one model advertised as able to read images replies that it cannot see them — so a real call still decides.
v0.10.2Fix2026-09-10
The till and the customer now say the same number
- A cashier finishing a sale was told the buyer had received 1,245,213 tokens. The buyer's own screen said 74,548. Same cup of coffee, seventeen times apart — the till was reading the top of a list sorted by which model stretches the balance furthest, while the customer is quoted their default model. Both now quote the same one.
- The list of models the credit works on is capped at the six that give the most tokens, with the rest one tap away. It had grown to 44 rows, which on a phone is a wall of text handed to someone who has just bought a coffee.
- The heading now says how many models the balance covers, so the number is visible without scrolling through them.
v0.10.1Fix2026-09-10
The last wholesale key is gone
- Only one supplier key is still read by anything: Google's, for embeddings and picture generation. Everything else now comes from Cloudflare on a single credential.
- The OpenAI key has been removed. Its last use was 15 August — the day its credit ran out — and speech-to-text moved to Cloudflare on 23 August at about a twelfth of the cost, so nothing has needed it since.
- The whisper entry in the model list was pointing at that dead key. It now names the model that actually does the transcribing, and says plainly that it is a permission marker rather than a route: real audio goes through a separate path that talks to Cloudflare directly.
- A note in the configuration claiming Qwen and speech-to-text still bypass Cloudflare was left over from before yesterday's move. It was corrected rather than left to mislead the next reader.
v0.10.0Fase 22026-09-10
Seventeen more models, and the last vendor key is gone
- The catalogue goes from 27 chat models to 44. Everything now comes from Cloudflare on a single credential — no wholesale vendor key is read by any chat model any more.
- Cheaper floor: nexus-nano costs $0.017 per million input tokens, about a quarter of the previous cheapest. gpt-nano, gpt-4o-mini, gpt-oss-mini and gpt-5-mini fill in the range below a cent.
- vision-mini reads images for $0.10 per million input tokens — less than half what the old cheapest vision model cost, with twice the context. llama-scout and gemini-flash-lite also read images.
- sea-lion is tuned for Indonesian and Southeast Asian languages, which nothing in the catalogue was before.
- Bigger contexts: glm-max holds 1.31M tokens, kimi-k3 1.05M, grok-4.3 1M. Plus gpt-oss, nemotron, qwen3.5, minimax and mistral.
- gpt-5.6-terra and gpt-5.6-sol answer again. They were being sent to the wrong endpoint because their configured name carried one prefix too many — a single word, and both had been silently falling through to another model.
- deepseek-vision keeps working but is now a nickname for vision-mini; Cloudflare has no DeepSeek vision model. The swap made it cheaper and doubled its context. Use vision-mini in new work.
- Every one of the twenty models was called for real and checked by name before being listed, and the ones marked as reading images were shown an actual picture — one model that Cloudflare advertises as vision replied that it could not see the image, so it is not marked as one.
- The example configuration on the guide page is now generated from the catalogue instead of typed. It had drifted to 19 models while the gateway served 44.
- ⚠️ Already have a key? Your model list was frozen when the key was made. It has been refreshed for general keys — in your editor, re-run the one-line setup on the guide page and restart it to see the new models.
v0.9.61Fix2026-09-10
Claude was answering as GPT, quietly
- Asking for Claude got you GPT. Cloudflare was rejecting all three Claude models, and the fallback chain answered with GPT instead — same shape, plausible text, no error anywhere. Only checking which model actually replied exposed it.
- The cause: the header carrying our Cloudflare credential was loaded correctly but discarded microseconds before the request left, by the callback that tags requests for cost attribution. Request-level headers replace configured ones rather than merging with them.
- The credential is now attached inside that callback, for exactly the models that need it — worked out from the configuration itself rather than typed into a list, because a typed list here has already gone stale once without saying so.
- All 27 models were then re-checked by name, not just for a reply. 24 answer as themselves. gpt-5.6-terra and gpt-5.6-sol do not, and were already broken before today — they are being handed to Cloudflare in a shape it refuses.
v0.9.60Fix2026-09-10
Every chat model now comes from one place
- Claude and Qwen answer again. Claude had been failing 229 times a day against a key that was deliberately a placeholder, and Qwen 80 times a day against an Alibaba account with an unpaid bill — both now come from Cloudflare, which supplies the provider credential and bills us for it.
- Fourteen models moved: the three Claudes, three Geminis, three DeepSeeks, four Qwens, and Grok. Every one was called for real before it was written into the config — a 200 response with an empty body does not count as working.
- Some prices moved with them, because Cloudflare's rate is the rate we now pay. Claude Sonnet fell from $3/$15 to $2/$10 per million tokens and Qwen Plus from $0.40/$1.20 to $0.32/$1.28; DeepSeek Flash rose from $0.266/$0.7975 to $0.44/$1.32, and Qwen Max from $1.60/$6.40 to $2/$6. The prices on the model list are the prices being charged.
- qwen-vl-max still reads images, and qwen3-coder is still a Qwen coding model — both are now the Cloudflare-hosted editions, so they are smaller than the Alibaba flagships they replace. They were also completely dead until today.
- Four wholesale keys stopped being read at all. deepseek-vision is the one model with no Cloudflare equivalent and still goes direct.
v0.9.59Fix2026-09-09
Balance appears when you get back, not eight minutes later
- Coming back from the payment page now checks that payment immediately and says what happened. Before, the page said nothing and the balance sat at zero until the background sweep noticed — and the sweep ignores anything younger than three minutes, then runs on its own five-minute tick.
- That wait was the normal case, not the unlucky one: measured on a fully paid sandbox card, DOKU reported success and never called our notification endpoint at all.
- The invoice number now travels back in the return URL, so the check is about THAT payment rather than a sweep of everything the payer happens to have outstanding.
- The check is scoped hard: it walks only the payer's own wallet and the house wallets of cafes they administer, so it can never be used to ask the gateway about someone else's invoice.
- It retries with a widening gap before giving up, and if it does give up it says the balance will still arrive on its own — because it will, and because 'not received' said too early is what makes someone pay twice.
v0.9.58Fase 22026-09-09
Somewhere to actually spend it
- New page at /tanya: chat for anyone holding balance. Until now redeeming a code credited a wallet, issued a key, and left the person with nowhere to ask a question — the only chat surface was the cafe's own, and that one answers to a session clock, not to money. We were handing guests something they could not use.
- It quotes TOKENS, not rupiah, and the figure moves when you change model — which is the honest way to show that one balance is many different token counts. The picker lists every model on the public tier with what the remaining balance buys on each.
- It does not meter the wallet itself. The request goes through the person's own key, whose ceiling already tracks their balance, and the usage sync debits afterwards exactly as it does for paying customers. Metering here too would have charged twice for one answer.
- An empty wallet is now told to top up rather than told our provisioning is broken. The balance is checked before the key, because 'top up' is true whatever the key situation is — only someone who HAS balance and still cannot chat is looking at our problem.
- Keys are issued with a concurrency cap and a rate limit. The budget ceiling only bites after a request records its spend, so without a cap several expensive requests fired together all passed the pre-check before any had been counted.
v0.9.57Fix2026-09-09
Two things a live run found that no local test could
- The token figure a guest is shown is now their DEFAULT model, not the median of the list. The list is sorted by token count, so its middle landed on whatever model happened to sit there — a real receipt quoted a number for a model the guest would never have picked.
- Finished the language sweep: the cafe setup form still had four Indonesian labels and half an Indonesian sentence, which only showed up when the page was opened on production with a cafe in front of it.
v0.9.56Fase 22026-09-09
A receipt, not a coupon: every line on the bill earns its own tokens
- A cafe now sets its own menu and decides, per item, what share of each sale becomes AI balance for the buyer. One cafe-wide percentage would either starve the coffee or bleed the food — a Rp 32.000 single-origin and a Rp 8.000 gorengan do not carry the same margin.
- New till screen: ring up the order, type the receipt number, get one code. The grant is summed line by line, so a basket of three different things earns exactly what those three things are worth — not a flat coupon value.
- One receipt can only ever mint one code. A POS that retries, a cashier who double-taps, a request replayed after a timeout — all land on the same row, and the till says so plainly instead of quietly granting the same sale twice.
- The guest now sees TOKENS, which is what they were promised, with the rupiah underneath as the accounting detail. There is no single token figure and there never will be — the same balance buys about 85× more on the cheapest model than the dearest — so one model is quoted as the headline and every model they can use is listed under it.
- The receipt's own lines are snapshotted onto the code. Editing a menu price next week must not rewrite what last week's receipt was worth.
- Fixed: the menu price field refused every round number. `min={1}` with `step={500}` makes the browser treat 1 as the step base, so 18.000 counted as a mismatch and the form silently refused to submit — no message, no error, nothing a cashier could have diagnosed.
- The whole journey is now covered end to end by an automated walkthrough — cafe signs up, funds a wallet, builds a menu, rings up three different orders; two different guests redeem, one of them twice; balances and the cafe's debit are checked to the rupiah.
v0.9.55Fase 22026-09-08
A cafe can now hand a guest balance that outlives the visit
- New voucher kind: instead of opening a 60-minute sandbox that dies when the guest leaves, a code can move rupiah out of the cafe's balance into the guest's own wallet, for keeps. It works anywhere, any day, and not only at that cafe — which is the whole reason it makes someone buy a second cup.
- Balance could be created and destroyed but never moved. Crediting a guest without debiting the cafe would have minted money out of nothing — the same shape as the promo-to-coin hole in the POS — so a real transfer primitive was the missing piece, not a nicety.
- A cafe cannot overdraw. Ten simultaneous redemptions against a balance that covers four leave exactly four paid and the balance at zero, never below it: the check and the debit are one statement, so two of them cannot both pass.
- One code can never pay twice, and neither can a retried transfer — every movement carries a key that is unique in the ledger, so a double-submit is a no-op instead of a second payment.
- A code costs the cafe nothing until a guest redeems it. Print a run of 500 and the ones left on the table are free; the panel says what the batch is worth if every code came back, next to what the cafe actually holds.
- If the cafe runs dry mid-batch, the guest is told whose problem it is — not blamed — and the code goes back to unused so it still works after the cafe tops up.
- Volume discounts survive the handover. A cafe buying at a wholesale rate hands over full retail value for its own discounted price, and the provider dollars on both sides of the move stay equal to the cent — this had to be right before tiered pricing ships, because while every unit sells at the same rate the bug would be invisible.
- The recipient inherits the rate the cafe bought at, not today's, so a currency move never quietly creates or destroys allowance in transit.
v0.9.54UI2026-09-08
One menu down the side, so every page is reachable from every page
- The panel now has a sidebar with grouped sub-menus — Akun saya, Kafe, Tim, Superadmin — instead of a different handful of buttons in each page's header. Groups collapse, and what you collapse is remembered.
- It replaces two flat tab strips — one for admins, one for superadmins — that were pasted into every page and had to be edited by hand for a new page to exist. The monthly cafe report was never added to either, so it was reachable only from one button on the cafe panel.
- The selected outlet now travels with you. Moving between panel, report and voucher used to drop ?unit= and quietly put a two-branch owner back on their first branch, reading the wrong cafe's numbers.
- On a phone the menu is a drawer behind one button. The dashboard header used to wrap six buttons onto three rows at 360px, which is the width the panel is actually opened at, behind a counter.
- Sign out, the theme switch and Buka Chat live in the sidebar footer now, once, instead of being repeated in fourteen page headers.
- The menu prints as nothing. Voucher sheets and the A5 table poster print from inside the panel, and a menu column down the side of them is wasted paper.
- The whole panel is back to one language — English. The cafe pages had drifted into Indonesian while the rest of the panel stayed English, so the same screen used two languages depending on which page you were on. The two strings actually read by guests — the promo caption you copy, and the words printed on a voucher card — stay Indonesian, because those are handed to guests, not read here.
- The monthly report picks its month from a calendar instead of six chips. The chips only reached six months back, so anything older had no way in at all; arrows step month by month and the next-month arrow is disabled, because a report for a month that has not happened yet is an empty page that reads like a bug.
v0.9.53Fase 22026-09-07
The first answer comes before the sign-up, and a cafe earns from its QR
- A guest who scans the menu QR now gets an answer immediately — no email, no code, nothing typed but the question. Verification appears afterwards, underneath the answer they already have, and the conversation is not reloaded or lost when they do it.
- That free answer is fenced four ways: the cheapest model in the catalogue, one question, a per-address limit, and a per-cafe hourly ceiling counted in Postgres rather than Redis — because the rate limiter fails open, and a door that spends someone else's money has to fail closed.
- Nothing is written down before verification. The pre-sign-up exchange is never stored, which is also what the privacy page now says.
- A cafe earns 15% of the first balance any guest it introduced buys for themselves. It arrives in the cafe's own balance automatically — no invoice to send — and is paid once per person, never twice for the same payment.
- New Outlet page: every cafe you manage in one table, with balance, sessions, spend and commission. This is the view an association needs, and it is also the fix for a two-branch owner topping up the wrong branch.
- Every cafe page now follows the outlet you picked — panel, QR, poster, report. Before, they all silently took the first cafe you managed.
- New monthly report per cafe: guests served, distinct people, answers given, cost, top-ups, and commission — with the gap between sessions opened and guests actually served, which is what tells an owner the QR is sitting too far from the table.
v0.9.52Fase 22026-09-07
The trust pages say something, and the retention is real
- Privacy now states how long each kind of data is kept — chat content 90 days, login codes a day past expiry, guest session records a year, and bookkeeping kept as company-document law expects.
- Those periods are enforced by a daily sweeper, not just printed. The page reads its numbers from the same constants the deletion uses, so the two cannot drift apart — a stated retention nobody implemented is a promise to strangers that the database quietly breaks.
- Privacy and Terms now name who you are dealing with: PT Digital Dunia Akhirat (Pluton), Yogyakarta, under Indonesian law.
- Contact is filled in with an address that actually receives mail, plus what to include so a billing question can be traced without a round trip.
v0.9.51Fase 22026-09-06
A cafe can sign itself up, and the top-up hands it a QR
- New page /cafe/daftar: a cafe registers itself in about a minute — name, city, a Google Maps or Instagram link, owner, email. No documents, and nothing to wait for.
- There is no approval step, on purpose. Paying is the verification: a cafe's guests cannot spend anything until it has a balance, and a balance only exists after a real payment through the gateway. That proves more than any file we could ask an owner to upload.
- The first top-up unlocks the thing an owner can actually use: the QR for their menu, a promo blurb to paste into Instagram, the QR as a PNG, and an A5 poster sized for a table stand. Before that first payment the panel says so instead of handing over a QR that would lead nowhere.
- Guests no longer need a printed code. Scanning the QR on the menu asks for an email, sends a six-digit code, and opens the session — one per address per day, funded by the cafe's balance.
- A cafe that runs out of balance now tells its guests in their language rather than failing at the chat screen.
- Signing in as a cafe owner lands on the cafe panel, and paying returns there too — not on a members list that means nothing to them.
v0.9.50Fase 22026-09-06
Sign in by email — WhatsApp login is gone
- One-time codes now arrive by email. The WhatsApp sender was another company's number: every guest received their code from a skincare brand, and a token rotation over there would have killed login here with nothing changed on this side.
- Google sign-in is unchanged. The email code is the second door, and the one that works inside the in-app browsers that QR scans open.
- A voucher is now bound to an email instead of a phone number. One code, one address, same as before.
- Adding a member now requires an email. Accepting a phone-only member used to be possible and would have created an account nobody could ever sign into.
- The WhatsApp sending code has been removed rather than left dormant, so nobody wires it back in by accident. Reviving it means either borrowing another company's number again or standing up our own — a decision, not an import.
v0.9.49Fix2026-09-06
Payments no longer depend on being told
- A sandbox payment on 6 September was reported by DOKU as successful while our notification endpoint was never called — not once. From our side that is indistinguishable from a customer who never paid: money taken, balance unchanged, no error anywhere. Caught in testing rather than by the first cafe to pay.
- Nexus now asks DOKU directly. Every few minutes it checks any payment still pending after three minutes and settles it if DOKU says it succeeded. A notification that is late, lost, or never configured no longer costs anyone their top-up.
- Both paths — the notification and the sweep — go through one settlement routine, so they cannot drift apart and cannot credit the same payment twice.
- When the sweep settles something, it says so loudly in the log: that is a payment the notification failed to deliver, and a run of them means the delivery path is broken rather than merely slow.
- The sweep also repairs paid balances that never got a key. Crediting the wallet happens even if issuing the key fails — losing your money because our gateway blinked would be the worse outcome — but until now nothing retried the key afterwards, and the balance sat there unusable. Seen in production the same day, during a deploy.
v0.9.47Fase 22026-09-06
A cafe can now pay for its own guests
- Cafes top up a prepaid balance on their own page and see, on the same screen, how many guest sessions that balance is worth and how many it has already served. Prepaid throughout: no balance is no service, and there is nothing to chase later.
- A top-up package belonging to a cafe credits THAT CAFE'S wallet, not the buyer's personal one. The package itself carries the routing, so there is no field a caller could point at somebody else's money.
- The guest budget used to be a number typed into settings — service a cafe had never paid for. It now comes from the balance, through the same machinery every other account uses: top up and the cap rises, guests use it and it falls, empty and the gateway stops it.
- A cafe's key carries the cafe package rather than the public one. The public package includes image generation, billed per picture, which would drain a prepaid balance far faster than the sessions it was bought for.
- Fixed before anyone saw it: the remaining-sessions estimate divided the balance by an average taken from two sessions, one of which was never used, and advertised "± 94,505 sessions" for Rp 100,000. The estimate is now weighted by how much evidence exists, and says plainly when it is still a guess.
- DOKU is verified end to end against the sandbox: checkout, a forged notification correctly refused, a real one settled exactly once, and the balance credited at the exchange rate locked on purchase.
v0.9.46UI2026-09-06
Pages a stranger can actually land on
- Terms, Privacy, Pricing and Contact now exist. Asking someone for a phone number and a payment without any of those anywhere was not a small omission.
- The privacy page is written from what the code does rather than a template — including the part most policies leave out: your questions are forwarded to third-party model providers. Two items are deliberately marked unfilled instead of invented: how long data is kept, and which legal entity is the controller.
- Pricing reads the tiers from the database, so a published price and the amount actually charged cannot drift apart.
- A page for cafe owners at /cafe, separate from the developer-facing home page. Two audiences, two pages.
- Superadmins can create a cafe, set its ceilings, and get its guest URL without touching the database by hand.
- Mobile fixes: the dashboard header no longer overflows a 360px screen, and four tables that were clipped with no way to scroll can now be scrolled. The landing images go through next/image, which is roughly a fifth of the bytes on a phone connection.
- Added a web manifest, theme colour, share-preview metadata, robots and sitemap — and Indonesian 404 and error pages, where before you got Next.js's English default.
- A brand-new account used to be told only to "contact an admin". It now gets the top-up button that was there all along.
v0.9.45Fase 22026-09-06
The guest chat, back inside Nexus
- Cafe guests now chat inside Nexus itself rather than being sent to a second domain with a second login. One address, one session, and the remaining time and messages are visible in the bar above the conversation — where the spending is actually happening.
- The screen is deliberately bare: one box, one button, and five example questions written in plain Indonesian. No model picker, no attachments. Every extra control is a question somebody who has never used AI cannot answer. The examples fill the box instead of sending, so you edit them and learn you are writing to a machine.
- Cost is measured from each reply's own usage, so a ceiling takes effect on the very next message instead of waiting for the five-minute sync a guest would be long gone before.
- When a session runs out you get a sentence and a way to continue, not an error. And when a model fails, you get "the AI is busy, try again" — the previous chat put the raw error text on screen.
- Fixed while testing: the remaining-messages badge counted a failed request as used. It is now derived from the replies that actually arrived, so it cannot drift from what you were charged.
v0.9.44Fase 22026-09-06
Coffee, then an hour of AI — vouchers and guest sessions
- A cafe can now print codes, and a guest who buys a coffee can turn one into an hour of AI without an account, an email, or an app. They enter a WhatsApp number, nothing more.
- The hour is what the guest sees; a rupiah ceiling is what actually stops the spend. A session ends on whichever arrives first, because a clock alone does not stop somebody pasting a long document twenty times.
- Guests are never handed an API key. Their traffic goes through the cafe's own key, so limits take effect on the very next message instead of waiting for a five-minute usage sync — and no stranger on cafe wifi is holding a bearer token. The cafe's daily budget sits underneath all of it as the hard stop.
- One code, one phone number. A code claimed while your session is still running is refused and stays unused, with the time your current session ends — losing a code you already paid for would be the wrong answer.
- Codes are stored hashed, so a leaked database contains nothing redeemable. The consequence is honest and stated in the panel: they are shown once, when printed, and cannot be shown again.
- Guest-facing pages are in Indonesian. The rest of Nexus stays English — these are two different audiences, not one inconsistency.
v0.9.43Fase 22026-09-06
The exchange rate is live, and the margin it really leaves is on a page
- Nexus converted rupiah to dollars at a fixed 16,000 that had not been looked at in a while. The market is at 17,636. The configured 2.0x markup was really delivering 1.81x, and nothing anywhere said so — the new Keuntungan page now says so in the first line.
- The market rate is fetched from four independent feeds and the median is used, so one feed going wrong cannot move anything on its own. If every feed fails the last known rate stands and is labelled stale — it never quietly reverts to a hardcoded number.
- The billing rate is now a setting you change on that page instead of an environment variable needing a rebuild, and it is recorded against whoever changed it.
- Changing it only prices future top-ups. Credit already bought keeps the rate it was bought at, because the budget cap is recalculated from your balance on every sync — a live rate would have quietly shrunk allowances people had already paid for.
- The page also shows real profit for today, 7 and 30 days with cost converted at the actual market rate, a per-unit and per-model breakdown, and a package calculator for answering "what if we did N sessions a month" without leaving the page. Units on markup 1.0 are cost tracking, not customers, so they are kept out of the profit figure instead of dragging it toward zero.
- The leaderboard is no longer public. It listed employees by name next to what they had spent, to anyone who knew the URL.
v0.9.42Fix2026-08-24
A dead provider no longer means a dead request
- If the model you asked for cannot be reached, Nexus now answers with a comparable one instead of handing you an error. On 23 August a single misconfiguration took out 15 of 24 models for about an hour and everyone simply got failures — that is what this prevents.
- The replacement is always chosen from a different route, because that outage killed whole routes at once, not individual models. A model that reads images only ever falls back to another model that reads images.
- Two things worth knowing: the answer may come from a model you did not pick — the response says which one — and its price per request can differ from what you expected. Billing stays exact either way. If your budget is exhausted, you still get a clear error rather than a silent substitution.
- Call logs are now archived off Cloudflare as well, so a future incident can be investigated properly instead of guessed at.
v0.9.41Fix2026-08-24
New models now reach the grant form on their own
- The superadmin "Add Employee" model list was hand-written and had gone stale without a sound — it was missing kimi, glm, nexus-mini, nexus-max and deepseek-vision, so new employees silently never got them. There was no error; the checkboxes simply were not there. It also still offered deepseek-reasoner, a model that no longer exists.
- That list is now assembled from the catalogue itself, and the build refuses to ship if the two disagree. Adding a model to the gateway makes it grantable automatically.
- New employees now get every chat model plus image generation by default. video-gen is left off on purpose — $1.20 per clip, and it is one sentence away in chat — as is whisper, which is a service endpoint rather than something a person picks.
v0.9.40UI2026-08-24
The Guide moved, and the budget models are now ours
- The Guide now lives at /guide instead of /panduan. Old links still work — they redirect — so nothing you bookmarked or shared is broken.
- The setup prompt for OpenCode got much shorter and more reliable. It now asks Nexus for the model block that matches your key, instead of working it out from raw API output. Run that same prompt again any time a model is added — that is the whole update process.
- hemat-mini and hemat-max are now nexus-mini and nexus-max. They are unchanged underneath: the same open-source models we host ourselves, still the cheapest things in the catalogue. Nobody had used them under the old names, so no key lost access — but if you had them written into an opencode.json by hand, re-run the setup prompt.
v0.9.39UI2026-08-24
Your OpenCode model list can now update itself
- OpenCode never discovers models on its own for a custom provider, so the list you wrote once is the list you keep — new Nexus models simply never showed up, and nothing told you. One command now returns the current block for your key: curl -s -H "Authorization: Bearer $NEXUS_API_KEY" https://nexus.drwcorp.com/api/opencode.json
- It returns only the models your key is allowed, and already marks the ones that can read images — the setting people kept missing, which is why screenshots seemed to be ignored.
- The Guide has the command for macOS, Linux and Windows PowerShell. Restart OpenCode fully afterwards: it reads model capabilities once at startup.
v0.9.38UI2026-08-24
Costs in USD, and a cheap model that reads images
- Your dashboard now shows cost in USD instead of Rupiah. Every model is priced in dollars, so the old figures carried a conversion you could not check and that drifted with the exchange rate. Small amounts keep enough decimals to stay readable — a cheap request no longer rounds to "free".
- New model: deepseek-vision. It reads images at the same price as deepseek-v4-flash, which makes it by far the cheapest way to work with pictures — qwen-vl-max costs about 3x more per input token. Note it is flagged experimental by DeepSeek, so treat it as something that could change.
- Your wallet balance stays in Rupiah, because that is the currency you actually top up in.
v0.9.37Fix2026-08-23
Requests that failed no longer count as usage
- A call that fails before the model answers is no longer counted as a request anywhere — leaderboard, reports, or your dashboard. It was rewarding broken scripts: this month one integration logged 2,805 failures in a single day, and every board built on request counts treated them as activity.
- This also fixes the Cost/req and Out/req columns. Dividing real cost by an inflated request count made every model look cheaper per use than it actually is — those averages are now honest.
- Nothing about money changed. The excluded requests carry zero tokens and zero cost, so every total, every charge and every margin is identical to the last decimal — verified against production: platform cost stayed exactly the same while the request count dropped from 61,541 to 58,697.
- Image and video generation still count, even though they report zero tokens: they bill per image and per second, and a tokens-only rule would have erased them along with the money they cost.
v0.9.36Fix2026-08-23
Leaderboard: failed requests no longer count as a model
- A request that fails before it reaches a model was being counted as if it were its own model. That inflated the model-variety count for four people this month, so the Explorer board ranked them above colleagues who simply had no failures — and it showed up as a nameless blank bar in "Models in play" plus an off-by-one in "Models used".
- Money and token totals were never affected: those rows carry zero tokens and zero cost. Spend, cost and the Biggest-spenders board were correct all along.
v0.9.35Fix2026-08-23
gpt-5.6-terra & gpt-5.6-sol are back, and two prices were corrected
- gpt-5.6-terra and gpt-5.6-sol work again. Both had been failing since OpenAI credit ran out; they now go through Cloudflare like every other model, so they no longer depend on a separate OpenAI top-up. Streaming and tool calls verified.
- Two prices shown on the dashboard were wrong, and both made models look MORE expensive than they are: gpt-5.6-sol was listed at $5/$30 per 1M tokens when it is actually $4/$20, and gemini-3-flash at $0.75/$3.75 when it is actually $0.50/$3.00. The token allowance estimated for your balance on those two models was therefore too pessimistic.
- Every model in the catalog now states its own price, and the build refuses to ship if what you see disagrees with what we are billed — the gap that let those two drift is closed.
- A brief hiccup is possible on a request that hits a provider glitch: instead of failing straight away, the gateway now retries once. Wrong-key and bad-request errors are never retried, so a genuine mistake still fails fast instead of burning your quota.
- The last Indonesian text in the interface is now English: the per-model columns on the dashboard and the tooltips and footnotes in the usage reports.
v0.9.34UI2026-08-22
Leaderboard in the nav + biggest spenders board
- Leaderboard is now one click away: it appears in the landing page header and footer, and is highlighted as the active page in the /leaderboard navigation.
- New "Biggest spenders" section on the leaderboard — ranks everyone by USD spent this month, with a per-model breakdown showing exactly how many dollars went to each model behind their run.
v0.9.33Fix2026-08-22
Guide: only your granted models + works on every OS
- The OpenCode auto-setup prompt now treats /v1/models as the single source of truth — that endpoint returns exactly the models the superadmin granted to your key, so models you're NOT allowed to use never appear in opencode.json again (/model/info is used only for vision/mode metadata).
- qwen-vl-max no longer disappears from generated configs: the gateway now declares mode: chat for it, so the "skip non-chat" rule can't drop this vision model.
- Cross-platform setup: the guide now covers macOS (zsh), Linux/WSL (bash), and Windows PowerShell for setting NEXUS_API_KEY, and the auto-prompt detects your OS/shell before giving the persist command.
- Manual config example completed with claude-haiku, qwen-plus, qwen3-coder, and deepseek-chat; the quick-guide now highlights deepseek-v4-flash/v4-pro instead of the old deepseek-chat alias.
v0.9.32UI2026-08-22
Guide: images now work in OpenCode
- Fixed the OpenCode setup so image/screenshot input actually works with Nexus models. The trick: each vision model needs "modalities": { "input": ["text","image"] } in opencode.json — not just "attachment": true. Without the image modality, OpenCode says "this model does not support image input" and silently drops the picture.
- The guide's config example and the auto-setup prompt now include the correct modalities, and remind you to fully restart OpenCode after editing (it caches model capabilities at startup).
v0.9.31Fase 22026-08-22
Grant new models to existing employees
- Employees whose key was created with a fixed model list didn't automatically get newly added models. Superadmins can now click "Enable qwen-vl-max" on the Employees page to add it to existing employee keys at once (keys that already allow all models — and deliberately-scoped service/transcription keys — are left as-is).
v0.9.30Fase 22026-08-22
Qwen vision + clearer image guide
- Added qwen-vl-max — a Qwen model that can read images (plain qwen-max/qwen-plus are text-only). Vision-capable models now carry a "vision" badge in the dashboard.
- Guide updated: it now explains that in coding tools (OpenCode/Cursor) a model only reads image attachments when it's marked "attachment": true, and the config examples include that flag. This fixes GPT/Gemini/Qwen "not seeing" images in the CLI.
- Guide code blocks now have a one-click Copy button.
v0.9.29UI2026-08-21
Leaderboard: show more
- Each category board now shows the top 5 by default with a "Show all" button to expand the full ranking (and "Show less" to collapse) — so the page stays compact as the team grows.
v0.9.28UI2026-08-21
Leaderboard shows everyone
- The category boards no longer stop at the top 3 — every person with activity this month is now ranked, so more people get their name on the board as the team grows.
v0.9.27Fase 22026-08-21
Adjust employee budgets
- Superadmins can now change an employee's monthly budget after they're created — no need to delete and re-add. Open Employees and set a new amount per person.
- Each employee now shows live spend against their cap with a bar, so it's easy to spot who's running low. Raising a budget takes effect immediately for the current month.
v0.9.26UI2026-08-21
Leaderboard: logos, more boards, cleaner field
- Models now show their provider brand logo — in "Models in play" and on each leader's model chips.
- Two new boards: Busiest (most requests) and Deep dives (highest tokens per request), plus a Unit standings section ranking whole teams by tokens.
- The internal operator unit is no longer shown as a team tag or ranked in Unit standings; those people still count toward the personal boards and totals.
v0.9.25UI2026-08-21
Leaderboard, redesigned & public
- The leaderboard has been rebuilt to match the landing page — a cinematic, full-width layout with a stat band, bar graphics, and no emoji.
- It's now public: anyone can view it, signed in or not. A new "Models in play" section shows every model reached through Nexus this month, ranked by tokens.
- The four boards (Most active, Most efficient, Explorer, On a streak) now sit side by side and each leader shows the models behind their run. Only tokens and activity are counted — never prompt content.
v0.9.24UI2026-08-20
One chat: chat.drwcorp.com
- The old built-in chat page has been retired. "Open Chat" now takes you straight to chat.drwcorp.com — the full cockpit with multi-model support, brand logos, connectors (ClickUp, Notion, …), and agents.
- Nothing to set up: your key is provisioned there automatically. This just removes the redundant early version so there's a single place to chat.
v0.9.23UI2026-08-20
Light / Dark mode
- Nexus now has a manual theme switch — tap the sun/moon in the header to flip between light and dark, on any page.
- Until now the look followed your device setting only; you can still leave it on System, but now you can override it whenever you like. Your choice is remembered on this device.
v0.9.22Fase 22026-08-20
Leaderboard
- New /leaderboard page, open to everyone signed in: a friendly monthly ranking that celebrates smart usage, not just spend.
- Four boards, each with a Top 3 podium — 🔥 Most active (most tokens), 💚 Most efficient (most tokens per dollar), 🧭 Explorer (most different models tried), and ⚡ On a streak (most active days).
- Reachable from the dashboard header and the Reports nav. It counts tokens and activity only, never the content of your prompts.
v0.9.21UI2026-08-20
Slimmer dashboard
- Dashboard trimmed: the API-key card stays (with a link to the Guide), but the setup examples (curl/Python/Node/Claude Code/Cursor + 'supported in') are removed — they all live in the Guide now.
- Sign-out button label is now English.
v0.9.20Fase 22026-08-20
Dashboard: token allowance per model + categories
- Your dashboard now shows your budget as a token allowance per model (no dollars) — how many tokens you can still use on qwen vs claude vs gpt. It's one shared allowance, so using any model reduces the count for all.
- Models are grouped by category (Fast & economical, Balanced, Coding, Reasoning) with a note on what each is best for — so users learn which model to pick and that reasoning models cost the most.
v0.9.19Fase 22026-08-20
Token usage shown to users + superadmin
- Your dashboard now shows 'Tokens used this month' — a big token counter with requests and a per-model breakdown, so everyone can see how many tokens they've burned.
- Superadmin reports add a total Tokens stat alongside Cost/Charged/Margin.
v0.9.18Fase 22026-08-20
Per-user drill-down: where did their spend go?
- Click any employee in /superadmin/reports to open their detail page: month totals, a per-model breakdown, and recent activity (time, model, tokens, cost) — so you can see what a heavy user's spend went to.
- Nexus records usage (model, tokens, cost) only — not the content of prompts or replies.
v0.9.17Fase 22026-08-20
Reports: per-employee-per-model + per-model for unit admins
- Superadmin reports add a 'Per employee × model' table (who used which model, with tokens/cost/charged).
- Unit admin reports (/admin/reports) now also show a 'Per model' breakdown, scoped to the admin's own units.
v0.9.16Fase 22026-08-20
Reports: per-model spend breakdown
- Superadmin reports (/superadmin/reports) now include a 'Per model' table — requests, tokens, cost, charged, and margin for each model this month, so you can see exactly where the spend goes (e.g. gpt-5.6 vs claude-opus vs gemini).
v0.9.15Fix2026-08-20
Fix OpenCode auth error (set apiKey in opencode.json)
- Guide fixed: OpenCode does not forward the /connect key for a custom provider, causing 'Authentication Error, No api key passed in'. The opencode.json examples and setup prompt now set apiKey to {env:NEXUS_API_KEY} (or inline), with a NEXUS_API_KEY export note.
v0.9.14Fase 22026-08-20
Chat access is automatic — no key to paste
- Sign in to chat.drwcorp.com with Google and every model is ready instantly — your Nexus key is provisioned automatically behind the scenes, so there's nothing to paste. Each model keeps its provider brand logo (GPT, Claude, Gemini, DeepSeek, Qwen, Grok).
- Access follows your Nexus account: active quota/allowance → chat works; deactivated → access is removed automatically. (Coding tools like OpenCode/Cursor still use your key from the dashboard.)
v0.9.13Fase 22026-08-20
Chat: brand logos per model + open connectors
- In chat.drwcorp.com, each model now shows its provider's brand logo (OpenAI, Anthropic, Google, DeepSeek, Qwen, xAI) instead of the Nexus mark — Nexus stays as the platform name. You pick a provider, then paste your Nexus key once per provider you use.
- Connectors are open to everyone: enable the built-in MCP connectors (ClickUp, Notion, Linear, GitHub, and more) or add your own MCP server, no special access required.
v0.9.12UI2026-08-20
Guide styling matches the landing
- Guide page header and headings now use the same frameless logo and lighter typography as the landing.
v0.9.11UI2026-08-13
English across the whole app
- All user-facing text is now English — landing, Guide (/panduan), dashboard, chat, login, superadmin & admin panels, and this changelog.
- Only visible strings changed; model names, routes, keys, and logic are untouched.
v0.9.10UI2026-08-13
Two-line counter-scrolling text + scroll-reveal
- The text ribbon is now two lines moving in opposite directions (capabilities scroll left, provider names scroll right).
- Scroll-reveal effect: titles and items fade-up as they enter the viewport (CSS scroll-driven, respects reduce-motion).
v0.9.9UI2026-08-13
More minimal landing + moving text
- Feature/use-case/CTA boxes replaced with a frameless typographic layout (em-dash — separators), larger and lighter type, logo frame removed.
- Added a large moving text ribbon (Chat — Coding — Images — ...) as a motion element between sections.
v0.9.8UI2026-08-13
Cinematic landing (Magnific assets)
- Landing redesigned in a cinematic editorial style: full-bleed hero photo (a person gazing at a purple network constellation) + a large thin headline, with 3 illustrated feature cards (One key / Budgets / Connect tools).
- All assets generated via Magnific with the Nexus indigo-violet palette.
v0.9.7UI2026-08-13
Real brand logos in the provider marquee
- The provider strip now uses official brand logos (OpenAI, Anthropic/Claude, Gemini, DeepSeek, Qwen, xAI) — uniform monochrome via Simple Icons, still scrolling frameless.
v0.9.6UI2026-08-13
More minimal landing + scrolling provider logos
- The provider section is now a scrolling logo strip (marquee) with no frames — brand-color dots, pauses on hover, fading edges.
- Landing copy slimmed down (hero and subheading) following the style of similar model-gateway sites.
v0.9.5UI2026-08-13
Landing: updated provider and model list
- Landing page adds a 'One key, every frontier model' section — 6 providers (OpenAI, Anthropic, Google, DeepSeek, Alibaba, xAI) with their flagship models + notes on image/video/transcription.
- OpenCode added to the 'Works with your tools' list.
v0.9.4Fase 22026-08-13
Claude back online + caching disabled
- Anthropic Claude is live: claude-opus (opus-5), claude-sonnet (sonnet-5), claude-haiku (haiku-4.5) — API key installed, costs tracked.
- Zero caching: LiteLLM response caching is off → every request is always fresh from the provider and usage is fully recorded (Anthropic/OpenAI prompt caching still runs automatically).
v0.9.3Fase 22026-08-13
Qwen3-Coder + model prices aligned to official rates
- Added qwen3-coder (Qwen coding model, dashscope/qwen3-coder-plus).
- Prices adjusted from official provider docs: grok-4.6 $2/$6 per-1M (docs.x.ai), qwen3-coder $1/$5 base tier (Alibaba Model Studio intl), qwen-max/qwen-plus already match LiteLLM rates. grok-4.5 removed (no public pricing from xAI).
v0.9.2Fase 22026-08-13
Added xAI Grok (grok-4.6, grok-4.5)
- New provider: xAI Grok — grok-4.6 (flagship) and grok-4.5. Verified replying via chat/completions.
- Prices set explicitly (estimated from grok-4 rates) so usage is still recorded — will be set precisely once the official grok-4.x rates are confirmed.
v0.9.1Fase 22026-08-13
Added Alibaba Qwen (qwen-max, qwen-plus)
- New provider: Alibaba Qwen — qwen-max (flagship) and qwen-plus (cheap/fast) via the international endpoint. Costs are tracked like every other model.
- The qwen3-coder coding model follows once its pricing is mapped (to keep cost tracking accurate).
v0.9.0Fase 22026-08-13
Coding model catalog expanded (SOTA per provider)
- The gateway now offers each provider's latest coding models: OpenAI (gpt-5.6-terra, gpt-5.6-sol, gpt-5, gpt-mini, o4-mini), Gemini (gemini-3-pro, gemini-3-flash, gemini-flash), DeepSeek (deepseek-v4-pro, deepseek-v4-flash, deepseek-chat).
- gpt-5 remapped to the flagship 5.5 (the old gpt-5.2-chat-latest target is now deprecated/404). All models verified replying via chat/completions and their costs tracked.
- Claude models removed temporarily until the Anthropic API key is installed. The coding models in OpenCode are now more complete than the chat picker — re-run the setup prompt at /panduan to refresh the list.
v0.8.10UI2026-08-13
Clarified: OpenCode usage shows up in the dashboard
- OpenCode guide clarified: whatever model you pick (GPT/Claude/DeepSeek/Gemini) is still recorded in the Nexus dashboard and deducted from your quota, because it goes through your own key.
- Reminder that numbers appear 1–5 minutes late (not realtime) and not to share your key with others — otherwise usage gets merged together.
v0.8.9UI2026-08-13
OpenCode guide: prompt that auto-fills the model list
- The /panduan page (For developers) adds a ready-to-paste prompt: paste it into OpenCode → its AI automatically pulls ONLY the models your key allows (from /v1/models) and writes opencode.json — no manual model list needed.
- Answers the confusion of 'why only the nexus model shows up': OpenCode doesn't auto-discover custom providers' models; the list must be written in opencode.json (now automatic via the prompt). A manual example is still provided.
v0.8.8Fase 22026-08-13
Audio transcription model (whisper)
- The Nexus gateway now has a 'whisper' model (audio → text transcription), via the /v1/audio/transcriptions endpoint — routed to gpt-4o-transcribe (better Indonesian accuracy).
- Used through each team's own virtual key → transcription cost is tracked per business unit (e.g. Arina CRM for transcribing WA call recordings).
- Not a chat model — it doesn't appear in the chat picker; unchecked by default in the employee/member form (enable manually if needed).
v0.8.7UI2026-08-10
Coding tool setup guide (OpenCode)
- The /panduan page adds a 'For developers' section: how to connect OpenCode (/connect → Other → nexus + opencode.json), base URL ai.drwcorp.com/v1, and pointers to the Claude Code/Cursor/Python/Node/curl examples in the dashboard.
- The ai.drwcorp.com page is branded as Nexus (the API gateway) instead of the default LiteLLM view.
v0.8.6UI2026-08-09
Nexus logo is now a vector SVG (adaptive)
- Logo replaced with a vector SVG (sharp at any size) — primarily purple (indigo→violet gradient), can go monochrome black/white via currentColor.
- Used on login, dashboard, chat, landing, guide, and favicon.
v0.8.5UI2026-08-09
Guide / employee onboarding page
- The /panduan page: onboarding + FAQ for employees (login, get a key, pick a model, ClickUp connector, quota).
- Guide link added to the landing, footer, and dashboard.
v0.8.4Fase 22026-08-09
All models usable + chat.drwcorp.com (LibreChat)
- Virtual keys now get access to ALL models by default (gpt-5, gpt-mini, Gemini, DeepSeek, Claude, image/video) — the Employee & Member forms check every model.
- Existing employee keys are updated so they can use all models.
- New employee cockpit: chat.drwcorp.com (LibreChat) — multi-model chat + MCP connectors (e.g. ClickUp) using each person's Nexus virtual key (still counts toward budget and reports).
v0.8.3UI2026-08-06
Rebrand to "Nexus" + animated hero
- Branding simplified to "Nexus" across the whole app (header, login, chat, tab titles).
- Landing: the hero image becomes a full background with a subtle drift animation; excessive badges/labels removed.
v0.8.2UI2026-08-06
Indigo-violet colors sharpened
- The primary accent is more vivid (indigo-violet) across the app + buttons stand out more.
- The hero and landing CTA gradients are now two-tone indigo→violet to match the buttons and logo.
v0.8.1UI2026-08-06
Public landing page
- New marketing landing page at the root URL — hero, features, use cases, and how-it-works (English).
- Header adapts: shows Sign in for guests, Open app for signed-in users.
v0.8.0Fase 22026-08-05
Manage Business Units (Cafe / Class / etc.)
- New Units tab: superadmins create their own units (pay-as-you-go Cafe, prepaid Class, Employees, Custom) without touching the database.
- Set markup per unit + enable/disable; balance-based units can get top-up tiers (pay → balance, automatic bonus).
- Unlock cafe & class: just create a unit → add members (Members panel) → top-up/budget.
v0.7.6UI2026-08-05
New chats appear in the sidebar instantly
- Send the first message → the conversation shows up in the sidebar list right away (title from the first message), no reload needed.
v0.7.5Fix2026-08-05
Fix gpt-5 + show errors in chat
- gpt-5 no longer replies empty — routed to the latest GPT-5 chat model (chat/completions), not the Responses API.
- Chat now shows an error message when a model fails or returns no reply (no longer silent).
v0.7.4UI2026-08-05
New chat UI (like ChatGPT/Claude)
- AI answers are now rendered as Markdown: headings, lists, tables, bold, and code blocks with syntax highlighting + a copy button.
- New chat layout: messages in a center column, a Nexus avatar for the AI, bubbles for you, a "typing" indicator.
- Rounded floating input (auto-grow, Enter to send / Shift+Enter for a new line) + the model picker becomes a pill.
- Tidy empty-state with a logo, greeting, and one-click example prompts.
v0.7.3UI2026-08-05
Nexus logo + tidier dashboard
- New Nexus logo (interconnected node mark) — shown on login, dashboard, and favicon.
- Dashboard: the "Supported in" list moved to the top + each tool gets an icon (lucide-react).
v0.7.2Fase 22026-08-05
Node.js API example
- Dashboard adds an example of using your key via Node.js (openai SDK).
v0.7.1Fase 22026-08-05
API guide in the dashboard
- Dashboard adds examples of using your key via API: curl + Python (OpenAI SDK), not just Claude Code & Cursor.
- "Supported in" list — 1 OpenAI-compatible key (the /v1 endpoint) works in Cline, LangChain, n8n, Dify, Open WebUI, and more.
v0.7.0Fase 22026-08-05
Balance & top-up · Admin role · save media
- Wallet/balance: manual top-up by an admin (active instantly) + online DOKU payment (QRIS/VA/e-wallet) that automatically adds balance via webhook.
- The balance (IDR) syncs automatically to the LiteLLM budget — out of balance → usage stops; usage is deducted from the balance per token.
- Admin role: a unit admin only manages their own unit (add members, top-up, reports) — can't see other units.
- Superadmins can promote Admins and assign the units they manage; new Balance + Admin tabs.
- Generated images and videos are now stored in object storage (Cloudflare R2) → they still show when you reopen the chat history; media is auto-deleted after 24 hours.
v0.6.0Fase 22026-08-05
Video generation (Veo)
- Pick a video-gen model → describe it → the AI makes a short video (Google Veo 3.1 fast, ~1–2 minutes).
- The video shows right in the chat with a player; the file is proxied securely (the key stays on the server).
v0.5.0Fase 22026-08-05
Multimodal — see images & make images
- Vision: attach an image in chat (photo/screenshot) → the AI analyzes it (gemini-flash model).
- Image generation: pick an image-gen model → describe it → the AI makes an image (Nano Banana).
- All usage still goes through your own virtual key → counts toward budget and reports.
v0.4.0Fase 22026-08-05
Internal AI chat + history
- Chat page (/chat) — streaming AI chat right in the platform, no IDE needed.
- Conversation history is saved (conversations/messages) + a sidebar to reopen them.
- Pick a model per message; usage uses your own virtual key → counts toward budget and reports.
- A "Open Chat" button on the employee dashboard.
v0.3.0Fase 22026-08-05
Cost & margin reports + usage sync
- A worker automatically pulls usage from LiteLLM every 5 minutes into usage_logs (idempotent).
- Reports page (/superadmin/reports): cost, billing, and margin per employee and per department.
- A budget bar per employee (live from LiteLLM) + Employees | Reports navigation.
- Cost is computed after cache; margin = billing − cost (markup from sell_pricing).
v0.2.0UI2026-08-05
shadcn/ui look
- Adopted shadcn/ui on top of Tailwind v4 (cards, inputs, buttons, checkboxes).
- Dark theme fix following the OS preference (fixes white-on-white input).
- The claude-sonnet & image-gen models are unchecked by default (opt-in, no Anthropic subscription needed).
v0.1.0Fase 12026-08-05
Initial release — Employee unit (Fase 1)
- Google login (open) + WhatsApp OTP login (shared DRW WA account).
- Superadmins create an employee → automatically generate a LiteLLM virtual key + monthly budget.
- Employee dashboard: key, base URL, remaining usage, how to set up Claude Code & Cursor.
- AI gateway at ai.drwcorp.com — OpenAI (gpt-5/mini), DeepSeek, Gemini models.
- Deployed on a VPS via Coolify + Cloudflare (nexus.drwcorp.com), Postgres+pgvector, Redis.