Bicrypto 6.6.0

1 August 2026

This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.

EMAILNOTIFICATIONSDELIVERABILITYSETTINGSLOGGINGDATA TABLESANALYTICSREPORTINGCHARTSDESIGNTHEMINGBRANDINGADMINDASHBOARDOPERATIONSUIPERFORMANCEWALLETSBUG-FIXESWITHDRAWALSDEPOSITSTRANSFERSKYCSUPPORTAUDITEXCHANGEPERMISSIONSROLESE-COMMERCEEXTENSIONSREVENUE

Core v6.6.0

Release Date: August 1, 2026 Tags: EMAIL, NOTIFICATIONS, DELIVERABILITY, SETTINGS, LOGGING, DATA TABLES, ANALYTICS, REPORTING, CHARTS, DESIGN, THEMING, BRANDING, ADMIN, DASHBOARD, OPERATIONS, UI, PERFORMANCE, WALLETS, BUG-FIXES, WITHDRAWALS, DEPOSITS, TRANSFERS, KYC, SUPPORT, AUDIT, EXCHANGE, PERMISSIONS, ROLES, E-COMMERCE, EXTENSIONS, REVENUE

Overview

An email reliability release that also rebuilds the record details dialog, the analytics tab, the admin dashboard and the permission gates behind every admin table.

Sending several emails at once could get your account temporarily blocked by your provider, and the platform's response — retrying immediately — made the block last longer and took every email down with it, including password resets. The platform now paces itself, backs off when asked, and holds queued mail instead of losing it.

Beyond that: 115 of 127 tables get a details dialog written for their record, all 65 analytics screens have been rewritten around figures that were previously impossible to express, 53 permission gates across 27 tables have been corrected, and the admin dashboard has been rebuilt as an operations console.

Several figures will read differently after upgrading — dashboard revenue, and numbers on the Analytics tab. In every case the old figure was wrong. See Upgrade Notes.

Update Instructions

pnpm updator

No settings need to change. Existing roles are migrated automatically.


Upgrade Notes

If you use your own SMTP server

Notification emails could previously be sent through a mail service — usually Gmail — even with the platform switched to your own SMTP server, because leftover Gmail lines in your configuration were still being read. Your Mail Provider setting is now the only thing that decides, so notification email will start going out from your own SMTP server.

Analytics figures will change

Numbers on the Analytics tab will read differently. In almost every case the old number was wrong; nothing in your data has been altered.

  • Cards labelled "Total …" now show the total. They previously showed a single month or day depending on the period. On a yearly view a "Total Deposits" card reading 1 was showing you April.
  • Yes/no counts have swapped or split apart. Pairs like Verified / Unverified showed the same figure, and it was the wrong half. They now show two correct numbers that add up to your row count.
  • Period buttons mean what they say. "7 Days" meant this calendar week, so on a Monday it covered one day.

Dashboard revenue will change

The revenue figure on the admin dashboard will read differently, and on most installations lower. No money has moved.

  • It counted gross fees charged, not what was credited to you, so it disagreed with the Finance profit report. It now reads the same profit ledger.
  • It added currencies together without converting them. A day with 0.0004 BTC and 12,000 NGN displayed as 12000.0004.

The system panel no longer shows CPU, memory and disk

  • Those numbers were not real — random values between 20–50%, 30–70% and 15–35%, re-rolled on every page load. No part of the platform was measuring your server.

Added

Operations inbox

An inbox in the admin header covering everything waiting on a decision. These queues sit in three different parts of the admin menu, so there was previously no way to see whether anything was waiting without opening all of them.

  • Added a count badge covering identity checks, withdrawals, deposits, transfers and support.
  • Added a per-queue breakdown: items waiting, age of the oldest, and how many are past target. Each line links to its queue; an empty one reads "Clear".
  • Added up to fourteen further queues from enabled extensions — P2P disputes and offers, NFT disputes and collections, store orders and shipments, merchant payouts, refunds and applications, token offerings, staking withdrawals, referrals, leader and strategy applications, forex deposits and withdrawals, and user questions. A queue appears only if its product is enabled.
  • Added an icon per queue, matching the icon that queue carries on the dashboard.
  • Added ordering by urgency — overdue first, then approaching target, then the rest.
  • Added the age of the oldest item and that queue's target on every row, with a bar between them.

Queue targets

  • Added three shared budgets for the new queues, chosen by the shape of the wait rather than by product: disputes 24 hours (escrow is held while these run), paid orders 48 hours (store orders, shipments, refunds), approvals 72 hours (offers, merchants, leaders, strategies, offerings, referrals, questions).
  • Applies to payouts and withdrawals of any kind use the existing 7-day withdrawal target; forex deposits use the existing 72-hour deposit target. The original five queues keep the targets they had.

Admin dashboard: operations console

  • Added a Work queue panel above the charts, listing every queue you can open with its count, the age of its oldest item, and a bar showing how much of its target that has used. Tiles turn amber at the halfway point and red once past it.
  • Added an alert band at the top of the page for anything past target, a stopped or duplicated scheduler, and critical service failures. It is absent when nothing is wrong.
  • Added Revenue by product — fee income broken down by what earned it, as a ranked list with each product's share. The platform has always recorded this and never shown it.
  • Added Your products — every enabled extension with its pending work and what it has earned, sorted so anything needing attention is first.
  • Added a scheduler line to the health panel. When the scheduler process dies every other check stays green while nothing scheduled runs — no price refresh, no investment settlement, no expiry sweep.
  • Added Busiest markets, listing the pairs with the most filled orders this period.
  • Added period-over-period change to the revenue, new-user and trading figures.

Record details dialogs

115 of the platform's 127 tables now open a details dialog written for that record, across core and every addon — users, transactions, wallets, orders, positions, deals, instruments, NFTs, e-commerce, mail campaigns, gateway payments and payouts, staking, P2P, ICO, forex, affiliate and the trading bot.

  • Added a real heading per record — the person's name and photo, the token's artwork, the market pair — with status badges beside it.
  • Added headline figures first: an order shows filled, remaining, total cost and fee across the top; a position shows its profit and loss.
  • Added fields grouped under headings that follow the record — Basic Information, Contact, Security, Pricing, Routing, Timeline — with tabs on longer records.
  • Added sizing to contents, so a short lookup record stays compact and a detailed order opens wide enough to read.
  • Added readable rendering of structured payloads as labelled rows, with long ones collapsed behind a "Show 12 fields" link.
  • Added a copy button on reference codes, set in a fixed-width font.
  • Added a collapsed timestamps section at the end, and a dash (or omission) for empty fields.
  • Added single-column reflow on phones and tablets.
  • Applies to the remaining 12 are short lookup tables — blog tags, currencies, investment durations, permissions — where a purpose-built layout would add nothing.

Analytics: calculations that were previously impossible

  • Added sums, averages, minimums, maximums and distinct counts. The engine could previously only count rows matching a status, so no screen in the product could display a total in your currency.
  • Added conditional sums — settled value rather than requested value, which on a payouts screen is the entire question.
  • Added ratios, dividing one figure by another for rates and shares.
  • Added point-in-time figures. A backlog, a total balance, escrow held and value locked are true right now; adding up a period's worth of them answers a different question.
  • Added rankings — "Top 5 gateways by settled value", "busiest agents", "most-blocked countries". This was the largest gap, because the interesting values are your data rather than a fixed list in a config file. Every ranking shows an Other row for the remainder.
  • Added ages and elapsed time — "oldest pending withdrawal", "average time to payout". Every queue-age and service-level figure was in this category.
  • Added overdue and stalled measures — "bots that have not reported in 15 minutes", "wallets untouched for 90 days".
  • Added either/or conditions, so a completion rate whose denominator is completed plus failed plus timed out no longer has to be written against one of the three.
  • Added automatic chart shape selection: five or fewer categories become a donut, more become a ranked bar. This cannot be set in advance because the number of categories is a property of your data — a breakdown by agent is one slice on a quiet desk and twelve on a busy one.
  • Applies to all 65 analytics screens have been rewritten. Each now leads with the figure that drives a decision — settled value on deposits and withdrawals, fee revenue on transactions, customer balance held on wallets, escrow on P2P offers, total raised on ICO, value locked on staking, open backlog on support and identity, capital allocated on trading bots.

Audit trail on records

  • Added an Audit Trail tab to customer and transaction records, listing every administrative action with who did it, when, why, and whether it succeeded.
  • Added the wallet balance ledger to that tab — every credit, debit, hold and release with the balance before and after. This ledger has always been written and had no screen anywhere in the product.
  • Added a platform-wide view at System → Audit Trail.

Decisions from the queue list

  • Added Approve and Reject to each row's menu on the withdrawal, deposit, transfer and verification queues.
  • Added multi-row decisions: tick several rows, decide once, give one reason. Successful ones are kept and failures reported individually.
  • Added ticket assignment to the support queue — assign to yourself, unassign, close or reopen in bulk. A ticket previously only gained an owner when an agent happened to reply first.
  • Added an age column to all five queues, amber as an item approaches its target and red once past it, using the same targets the dashboard health panel already used.
  • Added your own logo to the footer, following the same Navbar Logo Display setting used for the header — Square Logo + Site Name, or Full Logo Only.
  • Added the dark version of your logo on dark backgrounds, and immediate appearance of a freshly uploaded logo.
  • Applies to all three footer arrangements — Columns, Compact and Centered.

Changed

Email

  • Changed sending to a steady, paced rate rather than all at once. Messages exceeding the pace wait their turn.
  • Changed connection handling to reuse one sign-in across many messages. The platform previously signed in to your mail account separately for every message, which is what triggered provider blocks.
  • Changed your Mail Provider setting to be authoritative everywhere. One part of the platform read it and another guessed, which is how email ended up going somewhere unexpected.
  • Added two configuration settings for installations that send a lot of mail:
SettingDefaultWhat it does
MAIL_QUEUE_RATE_MAX10How many emails to send per minute
MAIL_THROTTLE_COOLDOWN_MS300000How long to pause when your provider asks (5 minutes)

Admin queues

  • Changed all five queues to open on pending items, oldest first, rather than the full list newest first. On an installation with any history the first page was settled records from months ago and the oldest outstanding item was on the last page.
  • Changed withdrawal rows to show the destination address or bank account, and the fee.
  • Changed transfer rows to show the destination wallet and the converted amount.
  • Changed rejection reasons to be delivered — emailed for withdrawals, deposits and identity checks, posted into the conversation on a support ticket.
  • Applies to the opening position only. Any other status is still one click away.

Admin dashboard

  • Changed the opening block from five charts to the Work queue panel. The charts remain, below it.
  • Changed the page title from "Admin Dashboard" to Operations.
  • Changed the extension recommendations from a "Smart Insights" panel above the fold to a Not installed section below the operational content, and removed the invented business cases attached to each one ("~12 daily trades detected, Futures can 10x your trading volume"). Each product now states what it is.
  • Removed the wallet button from the admin header. It shows your own balances, which belongs on the customer side, and the User button beside it goes there in one click.
  • Applies to layout and wording only. No link was removed and no product page moved.

Permissions

  • Changed every drifted gate onto a single name, so one permission does one thing. A screen is guarded in two places — the table decides whether to ask for data, the server decides whether to give it — and on 27 tables the two had drifted onto different names. Both existed, both could be ticked, neither worked alone.
  • Changed sections that shared one permission for every action into separate view, edit and delete keys. Copy Trading ran all 23 of its admin operations off one key, so a role that could view a leader could also delete one.
  • Removed 16 permissions that no screen or server route used — duplicates left behind by earlier renames. The list is now 678 entries, and every one does something.
  • Changed three permissions named against the platform's own convention. The binary-market one was a misspelling of "edit" and has been corrected; the two user import/export permissions are genuinely separate abilities and have been kept.
  • Removed the delete button on ICO Transactions. There is no delete operation for a token purchase anywhere in the platform, so the button could only ever fail.

Analytics presentation

  • Changed money to render as money rather than as a bare number.
  • Changed rising failure counts to be coloured as bad news. The up/down colouring followed the arithmetic rather than the meaning, so a screen whose cancellations had doubled showed the best-looking figure on the page.
  • Changed status charts to cover the whole set of possible states rather than a hand-picked subset.
  • Changed rankings grouped by a linked record — role, plan, template, referrer, strategy — to show names rather than internal reference numbers. "Accounts by Role" reads Admin, User, Super Admin, not 2, 4, 1.
  • Changed a card whose configuration is broken to say so in place rather than blanking the other nineteen cards on the page.
  • Changed every "line" chart from a filled area to a line — 78 of them. Where a chart plotted four series, four translucent fills were stacked over one another.

Fixed

Email delivery

  • Fixed a provider block taking down every subsequent message. The platform kept retrying immediately, which made the block last longer, and password resets, verification codes and withdrawal confirmations all stopped arriving.
  • Fixed queued mail being reported as failed rather than sent later. Messages that cannot go out immediately stay in the queue and are retried; anything still undeliverable stays visible in the admin queue for a manual retry.
  • Changed the response to a provider asking for a pause: the platform now pauses everywhere at once, across the whole installation, and resumes automatically. Nothing is discarded.
  • Fixed genuinely undeliverable mail being retried — a wrong mail password, or a recipient whose mailbox is full or does not exist. Those are now dropped immediately; repeatedly retrying a wrong password is exactly what gets an account locked.
  • Fixed the "local sendmail" option silently falling back to whatever other mail details were filled in.
  • Fixed secure connections on port 465 requiring extra configuration. A mismatch here showed no error — emails simply hung and timed out with nothing to explain why.
  • Fixed error messages listing every possible mail option instead of naming the setting missing for the method you chose.
  • Added a startup log line stating which mail setup is in use.

Admin dashboard reported figures it had made up

  • Fixed the System Status panel drawing CPU, memory and disk from random numbers. The panel is gone; Platform health in its place probes eleven real services.
  • Fixed overall system health being calculated from revenue — above 1,000 was reported healthy, below it a warning — so a new installation with perfect uptime was told it was unhealthy for not having earned enough yet.
  • Fixed the "Profit" line on the revenue chart being revenue multiplied by a hardcoded 0.7. The platform records no cost basis, so the line has been removed rather than re-estimated.
  • Fixed revenue being summed across currencies without converting them. Amounts are converted to USD first, and any currency with no configured rate is excluded and named on screen instead of counting as zero.
  • Fixed the dashboard and the Finance profit report disagreeing about revenue. The dashboard totalled gross fees charged; it now reads the same profit ledger the report does.
  • Fixed the "Transaction volume" chart summing amounts across every type and currency at once and labelling the result volume. It now counts transactions per type, which needs no currency.

Charts and queues

  • Fixed the Users-by-level chart grouping applications by something an application does not record — it holds a reference to its tier, and the tier's name lives on the tier itself. The query threw on every request, was swallowed by a debug-level catch, and the chart fell back to a single placeholder slice — on every installation, for as long as the dashboard has existed. Slices are now labelled with the tier name you configured.
  • Fixed the cumulative line on the user growth chart being built forward from an estimate, so on an installation older than the selected period it ended above your real user count and disagreed with the "Total Users" figure directly above it. It is now walked back from the current total and always lands on it.
  • Fixed the yearly view labelling its twelve monthly points as single days ("Jan 01, Feb 01") with tooltips reading "Wed, Jan 1, 2026".
  • Fixed the store Shipments queue looking for a status on shipping records under the wrong name — shipments are the one record in the set that names theirs differently. Left as it was, the queue would have reported itself unreadable rather than counting.

Analytics

  • Fixed 145 figures hard-coded to 0 that never changed — "Total Investment Amount", "Total Balance", "Total Marketplace Fee" and others — because no calculation existed that could produce them.
  • Fixed cards labelled "Total" showing one bucket. On a yearly view a year with deposits in January, March and April displayed "Total Deposits: 1".
  • Fixed yes/no pairs both showing the same number, and the wrong one. On a real installation of 72 accounts with 33 verified and 39 not, both cards read 39. This affected 96 figures across 21 screens.
  • Fixed the 3-month view silently discarding most of its data — it plotted roughly one day in seven.
  • Fixed period buttons not meaning what they said. "30 Days" meant the current calendar month, so on the 1st it covered a single day; "1 Year" ran to December and padded the remaining months with zeros.
  • Fixed 30 chart lines sitting flat on the axis with a legend entry above them, which reads as "we measured this and it is zero" rather than "nothing was ever calculated".
  • Fixed almost every card using the same generic icon, because the icon names the screens asked for were not the ones the platform could resolve.
  • Fixed analytics on the ecosystem and futures order screens reading zero on shorter periods. These screens use a different data store where the calculation only ran on the 3-month view and longer, so 24 Hours, 7 Days and 30 Days were zero regardless of activity.
  • Fixed "24 Hours" on those same screens meaning "the day around whenever anyone last traded", so an order book quiet for a month looked identical to a busy one.
  • Fixed a failed analytics request reappearing on a different screen. The loading and error state was remembered between visits and shared across every table. Browsers holding the old state are cleaned up automatically on first load after upgrading.
  • Fixed every label on a ranked chart reading "0". A ranking is drawn on its side, which swaps which axis carries the number, and the category labels were being run through a number formatter.
  • Fixed an average measured in hours returning a fourteen-digit number. Only on screens with real elapsed-time data — the four affected screens are all empty on a fresh install, which is why it survived testing.
  • Fixed a "total" card next to a live-position card silently switching to counting everything ever, because the two shared one internal name. A tag list showed 19 tags against a real 27.
  • Fixed "distinct customers" over a period reporting the busiest single day, because a count of unique things cannot be added across days. It is now measured across the whole period in one pass.
  • Fixed 46 captions overflowing the single line the card gives them, so readers saw half a sentence and an ellipsis.
  • Fixed cards sitting in grids that left holes, and chart pairs claiming more width than their row had.

Permissions

  • Fixed 53 gates across 27 tables where the table and the server required different permission names, producing a table with headings, a search box, period buttons and no rows — no error, no "access denied". Adding or removing permissions changed nothing, and only Super Admin worked because it bypasses checks entirely.
  • Fixed menu links leading to a blank screen on Homepage Sliders, System Announcements, Revenue Analytics and Investment Analytics, where the permission that showed the menu entry was not the one the table required.
  • Fixed 22 gates showing a Create, Edit or Delete button to staff the server would reject, or hiding it from staff it would have accepted — including approving a deposit, editing a binary market, adjusting a staking position and the NFT category controls.
  • Fixed the order history on a customer's own account being gated on staff permissions. Customers hold none, so the list never loaded — for every customer, on every installation, since the screen was added.

Record details dialogs

  • Fixed choosing an option from a dropdown, list or date picker closing the whole dialog.
  • Fixed those menus opening behind the dialog, so on some screens they were invisible.
  • Fixed Escape closing both the menu and the dialog at once. Escape now closes one layer at a time.
  • Fixed the heading showing the row's internal reference — #ec22deb0-1dbe-45e2-aaf7-… — instead of the person or item's name.
  • Fixed a profile picture appearing as a tile captioned "AVATAR — No Image" rather than as a picture, and a user's role showing as "ROLE — 1" when the record already knew it was "Super Admin".
  • Fixed transaction payloads, wallet addresses and trading schedules printing as one unbroken line of braces and quotation marks squeezed into a narrow tile.

Data tables

  • Fixed unticking a column in the Columns menu removing only its values. The heading stayed in place, leaving a titled but permanently empty strip until the page was reloaded.
  • Fixed the loading placeholder and "no results" message drawing at the wrong width straight after a column change, because the table's column count was out of date.
  • Fixed values sitting under the wrong headings on tablets. Tables drop the lowest-priority columns at that size, but headings were trimmed while rows were not, so every value after the first dropped column sat one place to the left and the last ran off the right edge.

Admin operations

  • Fixed the withdrawal rejection box arriving pre-filled with "Please provide a reason for rejection.", which was sent to the customer as the explanation if left unedited.
  • Fixed deposits and identity checks accepting a rejection with no reason at all. The field now starts empty and the confirm button stays disabled until it is filled in, enforced on the server so it covers single records, bulk actions and any other caller.
  • Fixed an admin approving or rejecting a transfer sending no notification of any kind. The sender was refunded in silence and the explanation stored where the customer could not see it. Both parties are now notified on approval, and the sender receives the reason on rejection.
  • Fixed "Start verification" writing Approved or Rejected in the same click that ran the check, with no confirmation, no applicant email and no history entry. The result is now a recommendation; applying it is a separate click through the same path as a manual review.
  • Added a requirement for reviewer notes when rejecting an application or requesting more information.
  • Fixed replies to anything other than a live chat being sent to the customer-facing route, which rejects a staff reply. The message failed quietly and the ticket appeared unanswered. Live chat was unaffected, which is why this went unnoticed.
  • Fixed the identity check queue having no page controls, leaving everything past the tenth application unreachable, and its search box and tab counts covering only those ten records.
  • Fixed the identity check verification type filter, which filtered on a field that does not exist and never returned anything.

Exchange imports deleted data without warning

  • Fixed Import Markets deleting every order ever placed on a delisted market, which is customer trading history. Orders are now never deleted by an import, and the confirmation says how many are being kept.
  • Fixed markets being removed while they still had open orders holding customer funds. Those markets are now skipped and listed so the orders can be cancelled first.
  • Fixed Import Currencies switching off every enabled currency on every run, so re-importing to pick up a fee change disabled the whole live currency list.
  • Changed both imports to read the exchange and show the plan first, listing what will be added, refreshed and removed. Nothing is written until confirmed.

Design changes did not reach the live site

  • Fixed a saved palette taking up to a minute to appear, and then requiring two reloads — the first after that minute still served the old palette. A saved palette is now live on the very next page load, for everyone.

Performance

  • Fixed the dashboard revenue calculation loading every completed deposit, withdrawal, transfer and trade into memory with its wallet attached, then looking up an exchange rate once per transaction — a full table scan plus thousands of price lookups, on the most-opened page in the admin. It is now one grouped query and one rate lookup per currency.
  • Fixed the dashboard blanking to empty cards while a refresh was in flight. Previous figures stay on screen until new ones arrive, and a failed refresh leaves the last good numbers up.
  • Fixed the Quick Access grid offering links the signed-in role could not open.
  • Fixed the wallet-connection library — the largest single dependency the platform ships — loading on every page. It arrived through the sign-in dialog, which every page includes so a signed-out visitor can be prompted; including the dialog pulled the whole library in, on the server and in the browser, for pages that could never use it. It is now fetched when someone chooses wallet sign-in.
  • Applies to pages built around a wallet — the NFT pages and the wallet tab on a customer's profile — are unchanged. Wallet sign-in behaves exactly as it did.

Server logs

  • Fixed installations running a separate scheduler process filling their logs with messages saying the trading engines were not running there. That is by design — the scheduler is not supposed to run them — but the platform announced it five times at every start and repeated two of the messages every five minutes, forever. Genuine problems are still reported immediately, and the admin cron dashboard is unchanged.
  • Fixed a misleading "restart loop" warning during development. It was designed to catch a server misconfiguration and fired on normal developer activity, with advice that did not apply.
  • Fixed a startup warning about browser storage on Node.js 26, which had a genuine fault behind it — the theme and sidebar preference stores could error while pages were being prepared on the server.
  • Fixed a "Lit is in dev mode" notice in the server log. It came from the wallet library and was never actionable, since live installations already use that library's production build. It is suppressed on its own without hiding any other notice the library might raise.