1.32.1 2026-10-03
Changed
- Every host you select is measured. The Agents tab could say "6 hosts not measured": the service kept at most 16 standing targets, so most hosts of the agents you subscribed to were left out. That limit is gone. Every selected host is probed continuously, at the slow pace pack hosts have always had and spread out so no two leave at the same moment, and the "not measured" line is removed. While the service is still an older version, the tab says so rather than claiming hosts it is not probing.
- The Overview’s live charts start higher. The rating’s sample ("1 of 2.5K probes lost in the rating’s last 15 minutes") and the "Last 7 days, on the record" line moved from two rows above the figures into the empty space under the figure tiles, so the first live chart is in view without scrolling.
1.32.0 2026-10-03
Added
- "Trace this host" on the Agents tab. When a service lost more than 2 of every 100 echoes, or did not answer, its row offers a button once that host’s echoes are done. It opens MTR Trace at that host, non-stop, to show where on the way the loss starts. For a host confirmed to answer no ping, the Web Checker is ticked for you, and the page says it was.
- Save image on MTR Trace, as PNG (the default) or JPG. The image is the whole trace, every hop including those scrolled out of view, in the theme you are using. It carries the host, the time it was taken and the app’s version, and a trace that is still running is stamped "In progress" with its round. The controls and the tabs are left out.
- Every file the app saves goes to one folder,
Documents\Helix Output, found from Windows’ own Documents folder, so a Documents folder moved to OneDrive is followed. If Windows cannot say where Documents is, the save is refused with a sentence rather than written somewhere else. Files are named for what they are and when, for example "MTR Trace - google.com - 2026-10-03 14.05.22.png", "Internet assessment - 2026-10-03 14.05.pdf" and "Service check (Quick sweep) - 2026-10-03 14.05.pdf". A second save with the same name gets "(2)" and never overwrites the first. Show in folder opens Explorer with the file selected.
Changed
- Agents sweeps ping their services instead of tracing them. Each host gets 100 echoes, one a second, and its row reads "answering", "answering, 3 of 100 lost" or, for a host that does not answer, what its service said (see below), with best, worst, jitter and the reply TTL one click deeper. A host that loses 2 or fewer echoes in every 100 reads as answering, because that is indistinguishable from noise; the counts are always shown. A sweep no longer says where on the way loss starts: Trace this host does that. The services stage of Assess my Internet is a sweep, so it pings too.
- A host that does not answer ping is asked over HTTPS and HTTP at most ten times in a sweep, after three echoes in a row go unanswered and then every ten while it stays silent. A host confirmed to answer no ping still reads "answers no ping · service up" and is never drawn red; one whose echoes and service both go quiet stays red.
- Reports from a sweep that pinged show each service’s round trip, its range and jitter, and say "Echoes were lost to N of them" where more than 2 in every 100 did not come back. They say that a sweep does not show where an echo was lost, and point to MTR Trace. A report from an earlier sweep that walked its paths still prints its routes.
- Live Path follows MTR Trace and the app’s own scheduled walks; a sweep no longer draws there, and the "Run an agent" button is gone.
- During a live support session, your provider’s desk sees the paths you walk, such as a trace in MTR Trace, and no longer sees sweeps.
- Sweeps no longer feed the Link Matrix’s gateway level. The matrix’s own walk now starts 40 seconds after the service, or as the startup sweep’s resolvers finish when that sweep is pinging the same hosts.
- Files saved before this version stay where they were saved, in
Helix Reports under C:\Users\<you>\Documents (which is not your OneDrive Documents folder if Windows moved it there); nothing moves them.
- Fixed on monitor.helixaicloud.com and helixaicloud.com since 1.31.0, without an agent release (the console and site sweep):
- the pages that told subscribers sharing with their provider is opt-in now say it is on by default for verified providers, with one switch to turn it off (the pricing basis, which still says "opted-in", waits for the operator), and the operator console’s ISP list says the same;
- the public page of a shared report no longer shows your public address or gateway; it says they are withheld on the shared copy;
- Helix’s own measurement points are no longer counted as subscribers in the public statistics, and one subscriber’s dead minutes are no longer charged to their provider because a neighbour was measuring;
- every page on helixaicloud.com carries the site’s security headers;
- an automatically made link to your provider no longer shares one service ID with every other subscriber of that provider, so the provider’s desk can read it, and you see "Linked automatically";
- the claim page has a box to type the code your provider gave you;
- in the pros marketplace a booking can be accepted, carries its visit code, and can be finished;
- pricing and the docs say what is kept: 3, 30 or 45 days of readable history by plan, and 45 days kept for everyone.
Fixed
- A sweep’s row for a host another run was already measuring read "0 of 0 lost". It reads "no echoes sent".
- While an agent ran again, its rows showed the last run’s results under this run’s live figures. They show this run.
- Saving a line diagnosis or a line evidence pack as a web page a second time could overwrite the first file. Every save is a new file.
1.31.0 2026-10-03
Added
- A sweep you start becomes one report, saved to your account. Run a sweep from Agents and, if the app is still open when it finishes and nobody stopped it, Helix keeps one combined report of it in your Helix account for seven days. A switch, remembered on this computer, turns that off. It is unavailable, with the reason, on an anonymous or unenrolled install. The sweep at startup and continuous repeats never upload.
- A PDF of any agent run from the last seven days, one step from every finished agent card and every row of "Reports from finished runs". While the switch above is on, it also saves a copy to your account.
- Reports carry the Helix Internet Monitor logo and a link to the console: the assessment and sweep report, the line evidence pack, the desktop’s diagnosis report and the public report page. Printed assessment, sweep and evidence-pack pages are numbered. When your account keeps a copy of an assessment or sweep report, the report links to that copy, and the link still works if you have to sign in first.
- A new sign-in page on monitor.helixaicloud.com: what Helix does and how it handles your data, beside the sign-in form, with links to the main site, the docs, privacy and terms. Light by default, dark one toggle away.
Changed
- The Overview has one "Assess my Internet" button, in the top bar. It opens the dialog with the plan, the progress and your recent reports; the card and the alert’s second button are gone.
- The trace page is called "MTR Trace" again, and the Diagnose page’s own tab is "Line diagnosis".
- A host known not to answer ping is no longer drawn red. When a host never answered an echo and either is known to block ping or its web service answered, the Agents tab draws it grey and counts its echoes separately ("answer no ping · not counted"), MTR Trace’s headline stays neutral, and the report marks it "ICMP filtered · service up". A host that is silent and whose service does not answer stays red.
- Path history keeps the agent’s own evidence: the hourly and outage traces, labelled by why each was taken, are no longer pushed off the list by MTR Trace passes.
- The connection record no longer blames every unmeasured minute on the computer being "off or asleep", a span that also covered the time before Helix was installed. It says Helix was not measuring, and lists the possible reasons without picking one.
- helixaicloud.com/terms says plainly that the terms of service are still being written.
Fixed
- A computer contributing anonymously was stored in the cloud under its own name. It is stored as "Anonymous device" whatever the app sends, and the names already stored have been replaced.
- The live charts’ axis cut the leading digit off wider latency labels: "52.8 ms" read "2.8 ms".
- Reopening the Agents tab showed every run as "never run". Kept runs now show their hosts, and a sweep stopped part-way still reads as stopped after the app restarts.
- The network devices list counted the broadcast address as a device.
- Two labels fell below the contrast standard: the left rail’s highlighted Instrument item, and the dimmed rows of the per-application usage table.
- The old sign-in page said sharing with your provider "stays off" and that per-application use is not measured. Sharing is on by default for verified providers; per-application use is measured and kept on your computer.
1.30.0 2026-09-25
Added
- A weekly outage summary, if you ask for one. Switch it on under Account on the web console and, once a week, Helix emails you how long each of your lines was without a connection, the longest stretch, and how much of the week your computers were on to watch — because "no outages" over four watched hours is not "no outages". Off by default, sent only to a confirmed address, and figures only: no addresses, no sites.
- Name your connections. "Home fibre", "Office": a name you give a line on the console heads its figures there and in your weekly summary, and is yours alone — no provider can read it.
- You hear when your provider replies. A reply to your ticket, from the ISP portal or by email, sends you a short notice pointing at the console. The reply itself stays in the console; the email carries no copy of it.
- For ISP desks: who owns a ticket, private notes, and escalation. The portal’s ticket card can now assign a ticket to a colleague, hold internal notes that neither the subscriber nor any upstream ever sees, and escalate to an upstream provider. Escalation never sends on the first click: it shows exactly what will be forwarded, to whom, and that it cannot be taken back, and only then offers Send. Each of the three is its own permission.
- The router panel on the desktop’s Overview links straight to the list of devices on your network.
Changed
- The web console loads in two requests per page instead of thirty-nine. Each page’s code is bundled at build time, so a console opened from far away no longer waits on a chain of small files before it asks for your data.
- The confirmation email now says what confirming your address actually does: the weekly summary if you switch it on, and ticket-reply notices. It had promised emails that did not exist.
- The operator sign-in form labels its fields.
Fixed
- A subscriber’s newest message on a ticket could not be forwarded to an upstream provider until the service next restarted.
1.29.0 2026-09-24
Added
- Assess my Internet. One button, at the top of every page of the desktop app and on the web console, that does what the product promises without anyone needing to know what an agent pack is. It runs, one after another:
- how your connection has been over the last seven days (read from what Helix already measured — no extra traffic);
- the Link Troubleshooter: your computer, your Wi-Fi or cable, your router and your provider’s first hops, with a speed test only if you tick it (the data it uses is worked out from your own line’s speed);
- the route to the services most people use, and where on the way any loss begins. It takes three to five minutes, keeps running if you close the window, shows which step it is on, and can be stopped — a stopped assessment still writes up what it measured and says where it stopped. It will not start while a diagnosis or a speed test is already running, and says so.
- Reports you can keep and send. Every assessment ends in one report: a verdict in plain words, what was found (each finding with what supports it and what argues against it), what to do next, and every measurement behind it — hop by hop for every service. Save it as a PDF or a web page from the desktop app, or open it and save it as a PDF from the console. Loss is given as counts ("3 of 100 lost") until there are enough probes for a percentage to mean something.
- A copy in your account for seven days. When this computer is signed in to your own Helix account, the report is also kept there for seven days, to open from any browser; the copy on the computer stays until you delete it. A computer contributing anonymously keeps its reports on the computer only, and says why.
- Assess from the web console. Choose one of your computers and it runs the assessment the next time it checks in (within a minute while it is on); the console shows whether it is waiting, running, done or could not start, and why. One at a time per computer, six a day.
- A report from any agent run. Diagnose → Agents keeps every finished run for seven days, and any of them can be made into the same kind of report.
- The Link Troubleshooter and trace tables read more plainly. A finished trace says in one sentence whether loss reaches the destination and which network it starts in; the sweep tiers say what they cover; the side rail calls the trace page "Trace a route".
- The web console, for subscribers: replies from your provider on a ticket can now be read and answered in the console; the ISP link form works for providers without an AS number; the create-account form says what a password needs; a pairing code can be typed in.
- The ISP portal: a subscriber’s service ID can be confirmed from their page, tickets past their target are marked and counted, and rows open from the keyboard.
Changed
- The web console loads faster. Every page now asks for all the code it needs at once instead of discovering it one piece at a time, which from Kenya was most of the seven seconds before the dashboard’s first figures.
- One set of words for how good a score is — excellent, good, usable, poor — on the score card, the provider band, the Link Matrix and in reports, at the same cut-offs everywhere.
- Every loss figure on the Overview says what time it covers, and one stray lost probe no longer turns the top bar to "Line drops".
- Loss is written "3 of 100", never "3/100", on both surfaces.
- The console’s Overview leads with your connection, with the counts below it, and its captions give the history your plan actually shows.
Removed
- The "Getting started" card on the desktop Overview, and the step lists on the console for new accounts. Helix does not greet people with a list of tasks. An account with nothing measured yet now simply says so.
Fixed
- The Overview’s Loss tile could never show a rate: it was fed three one-minute windows (about 180 probes), always below the 300-probe floor.
- The operator’s fleet message now takes two clicks to send, and admin errors show the server’s own reason rather than only a status code.
- ISP staff passwords now need 12 characters, the same as subscribers’.
- The London measurement box walks routes now, so every ranked host on NETStats has its route component from both boxes.
1.28.0 2026-09-24
Added
- "Your line, on the record" on the Overview. Four questions you would take to your provider, answered from what this computer measured over the last 7 or 30 days:
- Are you getting what you pay for? Tell Helix the speed on your bill and every speed test on that provider is held against it. You get a verdict — delivers, sometimes short, short, or not enough tests yet — with the evidence for it and the evidence against it side by side. Tests on another network, or run while this computer was already busy downloading, are set aside and counted, never quietly mixed in.
- Did it stay up? Minutes down out of minutes measured, a bar per day, and the outages with their start and length. A minute counts as down only when all three public anchors went silent together; time the computer was off is counted as neither up nor down.
- Does it hold up when you use it? Latency while this computer is quiet against while it is busy on the network, from the measuring it already does — no extra traffic.
- Is it your Wi-Fi? Signal strength over the same days, read every five minutes. The network’s name is never read.
- Save as a file writes all of it as one page you can attach to an email to your provider. Your plan and your Wi-Fi history stay on this computer and are sent nowhere.
- Scheduled speed tests, if you want them. Off, once a day or four times a day, with the data each choice costs worked out from your own line’s speed. A scheduled test never runs on a metered or roaming connection, during a diagnosis, or once your data budget is used up, and Settings says when one was skipped and why.
- Getting started. A new install shows what has already happened (measuring, your provider identified) and what is worth doing next (your plan, a first speed test, signing in). It is worked out from what the service reports, disappears once done, and can be hidden.
- Settings, reorganised. Account, Appearance, Notifications, Monitoring, Plan & data, Privacy & sharing, Startup & window, On this computer, DNS, About, and Help & feedback. New there:
- start Helix when you sign in to Windows, or not;
- silence notifications for an hour or eight;
- your data budget;
- one page listing everything that leaves this computer, with the switch for each;
- clearing what Helix keeps on this computer.
- Alert rules can write to the Windows Event Log and show a card. Each rule is judged over its own time window and its own target, rather than over the last minute of one anchor.
Changed
- Signing in is clearer. A new install contributes anonymously within seconds, and the top bar used to call that "signed in". It now says Sign in until you have signed in with your own account. A sign-in waiting in the browser can be opened again or cancelled. Signing in after contributing anonymously carries the last 30 days into your account.
- Closing the window says Helix is still measuring, once, the first time you close it.
- The console is organised into tabs — Overview, Evidence, Your ISP, Devices and Account for subscribers, with sub-tabs on the ISP portal and the operator console. Old links still open the right tab. This shipped to the console on 24 September, ahead of the app.
Fixed
- The console, checked on live data rather than test data, and fixed:
- The operator’s diagnostics table squeezed every message into a column one letter wide.
- The theme button’s icon was drawn a few pixels wide on every page.
- The account card showed no email address, and "not confirmed", for every subscriber.
- The health page reported the rankings as late every night after midnight.
- Dates appeared in four different formats.
- Older path traces fold under the newest one per destination.
- "How your line compares" now shows your own figure for every destination you measure. These went live on 24 September.
- A first install now reports that it happened. The installer wrote that note into a folder that does not exist until the service first starts, so only upgrades were ever counted.
- The Overview’s day map fills within a minute of a new install, not five.
1.27.0 2026-09-23
Changed
- The console and the public site use the desktop app’s colours for finding your way. The app groups its pages into four kinds, each with its own colour: watching your line (blue), investigating a problem (violet), measuring use (plum), and the instrument itself (amber). The console and the site now use the same four:
- On the console’s dashboard, each card shows a small square in its colour beside its title. Each page’s lead card takes a wash of the page’s colour, and the selected section tab is underlined in it.
- On the features page, each feature’s diagram is drawn in its colour. Each section of the desktop guide has its square, and the contents list highlights the section you are reading in its colour.
- The home page’s figure shows each product in its own colour: Internet Monitor blue, NMS+ teal, NETStats amber. Product pages carry their colour in the background at the top. The colours only tell you what kind of thing you are looking at. They never stand for a status or a measurement, and all text meets the contrast standard in both themes.
- The NETStats ISP table shows no loss or latency figures for a provider measured by fewer people than the publication floor. Its row still appears, with its contributor count, and the figures read "—" until enough people contribute.
- How many machines reach a host is now counted per day. It used to be a running total that only grew. The host lists on NETStats rank by the busiest recent day, and so start again from zero with this release.
Fixed
- A change of provider could go unnoticed indefinitely. If the one lookup that identifies the new provider failed at the moment the address changed, the app kept the old provider’s name, never asked again, and filed every measurement from then on under the wrong line. It now asks again on the next check, and once each time the service starts.
- A failed update was never retried, and "Check now" could not install it. After an update failed to install, the panel said one was available but nothing happened until the next release or a restart. The service now tries again after its wait, and pressing the button always fetches the release afresh.
- Activity ratings read better the more of the line was lost. A period with every probe lost pulled the latency figure towards zero. Latency is now averaged only over probes that came back.
- After a change of provider, the Link Matrix could start with hops from the old line. Walks stopped by the change still reported what they had seen. They are now ignored.
- A change of provider switched off continuous operator packs until the service restarted. They now carry on, on the new line.
- Stopping a continuous pack during its one-minute pause did not stop it. It ran once more. It now stays stopped.
- Stop did not stop a speed test. It was reported as stopped and kept using the line, even across a change of provider. It now ends at once.
- A stopped sweep still sent web checks to the hosts it had not reached. It no longer does.
- The Workbench’s first walk lost its Stop button. Opening the Workbench on a fresh install started a walk, then marked it as "ended while away" while it kept running. Reopening the Workbench could also start a second walk of a host already being walked.
- The Workbench’s name tool refused names the system resolver could not answer, which is often the problem being checked, and names with no address such as a TXT record. A reverse lookup of an address returned nothing. A port the network refused to route to was shown as "refused by the host"; it now reads "unreachable".
- Live Path could stop updating after a walk it was following ended early, and its chart plotted the previous round’s figures. It also now clears when the provider changes.
- The topbar’s run count was too high during a sweep: each host of the sweep was counted as a separate run.
- The server address in Account was put back every five seconds while you were editing it.
- Signing in from the desktop opened the pairing page without your code, so it had to be typed again.
- Coming back to the Troubleshooter during a diagnosis showed Run instead of Stop.
- Usage could show the previous period’s figures under the new period’s heading after switching quickly.
- The Alerts card said "50 in the last 7 days" whenever there were more than 50. It now shows the real count up to 100, then "100+".
- The Vantage card printed "0 events, longest run 0", figures it does not have. It now shows the counts it does have.
- A reply to your feedback did not appear in a conversation you had open until it was closed and reopened.
- Smaller desktop fixes: a folded live strip could stop updating, a continuous sweep could restart after being unticked, and the Internet Metrics board showed "up · (HTTPS 200)" instead of "up · HTTPS 200".
- The console signs you out when your session ends instead of leaving every card saying the service is unavailable.
- A change on the console could be undone by a refresh that was already running: switching sharing off, revoking a device, or publishing or sharing a result could flip back for up to a minute.
- The admin console’s Crashes, Diagnostics and Feedback tabs only loaded after a broadcast had been sent.
- Buttons stayed disabled after a failed request (verify an organisation, revoke a broadcast, withdraw a claim).
- Sign-in errors read
[object Object] on the ISP operations and admin consoles.
- The ISP portal’s feedback badge stopped updating after signing in again, and switching tabs loaded each tab twice.
- The ISP portal’s chart plotted loss rates from too few probes, and its live support view showed "0.0 ms" when every probe was lost.
- Switching quickly between feedback threads or diagnostics filters in the admin console could show the previous one’s content.
- Two people using the same connection id each have their own record of it. The second person’s uploads used to be refused.
- Loss counts from an agent can no longer claim more lost probes than were sent.
- ISP digests reported every subscriber of a reseller as silent, and quoted loss rates from too few probes. They now use the same scope rules as the portal, count only well-measured services as clean, and name the organisation rather than an AS number.
- The ISP portal’s trace list and wrong-line check read further back than the subscriber’s own account can see. They now stop at the same point.
- Messages to an unverified organisation are refused with a clear reason instead of an error.
- Connection-failure reports from the agent now include the underlying cause (for example, a refused or timed-out connection), not just "error sending request".
- A diagram on the features page had text running out of its boxes ("when the line changes hands").
1.26.0 2026-09-23
Changed
- The public site behaves like the instrument it describes. Every diagram draws itself as it comes into view, in the direction its signal travels, from the subscriber outward. On the home page a probe travels the path from your devices to the hosts, lighting each station it passes through, and its echo comes back. The Monitor page’s example verdict assembles from its evidence, supporting then contradicting, before the conclusion resolves. The pricing page has a 45-day ruler showing how far back each tier reads. The changelog has a timeline that draws as you scroll. The documentation’s contents follow the section you are reading. The statistics tables fill row by row as the figures arrive, and each NETStats score draws a meter under its number. A line under the header traces how far down the page you are, and pages move into one another rather than reloading.
- Everything moving is optional. With reduced motion set in the operating system (Windows: Settings, Accessibility, Visual effects, Animation effects), or in a browser without the newer animation features, every page renders finished and still, exactly as before.
- The small uppercase labels above headings are gone from every page. Each heading now says what its section is on its own.
- The web console moves the way the desktop app does.
- A figure that changes rolls through the values between the old reading and the new one, and lands on the new one.
- A gauge sweeps to its reading: from empty the first time, from the last reading after that.
- A chart’s lines draw in once, left to right.
- A table’s rows arrive one after another the first time it fills.
- Moving between console pages cross-fades while the top bar holds still. The console refreshes every fifteen seconds, so only a reading that changed moves; nothing replays on every refresh. With reduced motion set, the console is as still as the desktop app.
- The desktop app and the console draw the same controls. Buttons, segmented controls, pills, chips and cards are now defined once and shared by both, and they had drifted:
- the console’s primary button had a fainter edge;
- its secondary button had a grey fill;
- its small buttons were taller, and its pills larger and heavier;
- its chips were smaller;
- its text fields stood 4px taller than the buttons beside them;
- its card titles were spaced looser, and two of its tables had bold headers. The console’s cards no longer lift under the pointer, matching the app, because a card is something you read, not something you click. Drop-down lists in the console’s dark theme now take the theme’s colours, as they already did in the app.
Fixed
- A rolling figure could show a wrong number for one frame. The desktop app’s counter briefly showed a value outside the range it was rolling through (−19 on the way from 12 to 40) when the first animation frame arrived early. Found while porting it to the console; fixed in both.
1.25.0 2026-09-23
Added
- The Diagnostics panel says whether an issue is still happening on the release the fleet is being offered. Every issue row now carries a "live on 1.25.0" or "not on 1.25.0" pill beside its versions. Half the open issues had last been reported several releases back, and nothing told them apart from the ones live on the current build. Nothing resolves itself: the pill is evidence, and a person still marks the issue.
- Console traces say "unreached" in words. A trace that never reached its destination leads with that, marks the destination row, and folds the silent hops after the last reply into one line, as the desktop has done since 1.24.1.
- The public site covers what the product does now: the Link Matrix’s rule that a host earns its place by answering, three-state reachability, the Web Checker switching itself on, per-program icons and a year of usage, the reset when your provider changes, the diagnostics channel and the machine profile it carries, and NETStats’ quality rank beside its use rank. Eight new diagrams, drawn in the site’s own art grammar.
Changed
- A failed update is not retried every minute. A machine where Windows Application Control refuses the installer downloaded the whole installer again every minute — 227 times on one box. The service now holds a release that failed to apply for ten minutes, doubling up to a day, and waits a full day straight away when the refusal is a policy block, saying so in the update status. A check you start yourself still tries at once, and a successful update clears the hold.
- Two routine events are no longer filed as warnings: an update finding nobody signed in to relaunch the app for, and a path walk refusing a host somebody mistyped into the Workbench.
- The landing page’s hero shows where each platform looks. A decorative helix, drawn 800px tall under the hero since the hero went full width, is replaced by a figure of one subscriber’s path, from their devices to the hosts they use. It marks the stretch Internet Monitor measures, the stretch NMS+ runs, where NETStats ranks, and the contract between the first two, with a caption saying the same in words. On eleven other pages the hero art had been drawn at the same 1072×804px; it is now a faint watermark on the hero’s right, and the copy keeps its full width.
- Tighter spacing between the site’s sections. Band padding went from up to 88px to 56px, and the hero’s top from 104px to 64px, removing the large empty gaps between sections.
- The site’s privacy page and product overview describe ISP sharing as it actually works. A connection on a verified provider’s network is shared with that provider by default, and turning it off is permanent unless you turn it back on. The pages said it was off until you turned it on, which has not been true since 1.7.0. The behaviour is unchanged; the copy was wrong.
Fixed
- No page on any surface is served with a
.html extension. The marketing site now answers every .html address, including index.html, with a permanent redirect to its clean address, and no longer serves a page when the extension is missing from the request. Shared speed-test pages linked to two .html addresses on the site that returned 404; they point at the right pages now. A new test pins all three surfaces.
open-items.mjs no longer reports a check that timed out as a disagreement with the register. It says STALLED and asks for a re-run.
1.24.2 2026-09-23
Changed
- The agent packs are ordered work first, play last. Work accounts, Meetings and chat, Hardware & vendor support, then the shared infrastructure (Public DNS resolvers, Google services, AI tools, Helix infrastructure), then Meta services, Social media, Streaming, and Gaming at the bottom — on the launcher, the At a glance table and the cards.
Fixed
- The live hop rows line up. The network column took a fixed track at the far right of the row while the address column stretched, so operator names sat clipped against the figures with empty space to their left. The address is the fixed column now (one address wide, as on the MTR table) and the network takes the remainder.
1.24.1 2026-09-23
Fixed
- A path that never reaches its destination says so, and nothing else. The strip above the hop table used to quote the furthest router that did answer — "not reached · furthest answer at hop 4" in small print beside a big healthy "7.3 ms" — so an unreachable host read as a fast one. The state is the headline now, in the down colour, with the round count and the web check’s verdict beneath it.
- Every Link Matrix row gets its flag and operator. A continuous anchor is only ever enriched on the matrix page, and nothing had asked about London’s address; a row with no cached operator now asks, off the orchestrator’s thread, and has it on the next poll.
Changed
- The Internet Metrics board’s sites are Link Matrix anchors. Every echo the board sends — cisco.com, news.bbc.co.uk, dell.com and the rest — also feeds the matrix, banded by its own median, at no new traffic.
1.24.0 2026-09-23
Fixed
- The Link Matrix no longer scores your line by hosts that answer no ping. An anchor that has never replied has no median, so no band, so no level — it used to fall into CDN by default, where epicgames.com, playstation.com and slack.com sat as "4 of 4 lost" and dragged the nearby-content score for a host’s policy. They are listed in their own "answer no echo — not scored" table now; the compiled-in echo-filtered hosts are never anchors at all. IP transit remains what it was: hosts that answer, at a median above 80 ms.
- Every program gets its icon. The service reads the icon itself, as SYSTEM, from the path it already resolved when it named the process — so a program in another user’s session, a Store app that is not running, or a per-user install the registry never named no longer wears a lettered tile. The app asks its own shell first and the service second; the path never leaves the service.
Changed
- The Link Matrix’s member rows read as places: a flag, the operator through the same dedup every hop table uses, and a state pill — clean, or the loss as counts.
- The Usage page’s address rows do too: the raw registry string (
SKY TREND NETWORKS LIMITED - SKY TREND NETWORKS LIMITED, KE AS328482 KE) is now a flag, one name and an AS pill, on both the per-application detail and the "Where it went" table.
1.23.0 2026-09-23
Added
- A change of provider resets everything that was measuring. When the line’s ASN changes — a different ISP, a phone’s hotspot, a VPN taking the route — the service stops every sweep, path walk, ping box and diagnosis, forgets the running figures (the Link Matrix, the bandwidth ring), and re-runs the base-case sweep for the new line once the stopped ones drain. The Workbench tabs, the Agents panel and the ping boxes clear the old line’s transcripts and say why. A first sighting of the line is not a switch and resets nothing.
Fixed
- A destination that answered and then went dark is reported as such, at once. Every hop table and every Agents row now keeps the live half of reachability — answered this round, or silent for N rounds — rather than only the sticky "reached". The service asks the destination over HTTPS and HTTP at its first silent round (it used to ask only a host that had never answered), and again every fifth round while it stays dark, so "service up (HTTPS 200)" is never an hour-old verdict and a service that goes down after the first check is seen going down: "service was up · not answering now".
- A destination that comes back is reported as back. Echoes returning reset the silent count on every surface; the ICMP-filtered reading is never kept past the round that disproved it.
1.22.4 2026-09-22
Fixed
- Per-application history now records while nobody is looking. The five-minute window was closed and stored only when the Usage page was polling the live answer — and since the page opened on six hours of history instead, nothing polled it, nothing closed, and "nothing was recorded over this period" was the truth on a machine that had run all day. The service’s own once-a-second usage tick closes the window now, app open or not.
- Programs that are not running get their icons too. The icon lookup only knew running processes, so a history table of the day’s programs wore blank tiles beside everything but the two open at that moment. It now also finds an installed program where it registered itself (App Paths, the Uninstall register); a miss is retried after ten minutes rather than remembered for the session; and a program with no icon at all shows its initial in the tile rather than a blank.
1.22.3 2026-09-22
Fixed
- A host that answers no ping now says what that means, seconds in, and keeps saying it. The service had been asking the destination over HTTPS and HTTP at the end of the first silent round and putting the answer on the wire there — but the Agents panel took every frame whole, and the partial frames between rounds carry no web answer by design, so the row showed the conclusion for a quarter of a second and reverted to "asking the service" for the rest of a hundred-round walk. The panel now keeps the last answer until a round replaces it.
- The conclusion is stated rather than left to the reader. A host whose service answers while its echoes do not is almost certainly filtering ICMP, so every surface — the Agents rows, the ping boxes and the text report — now reads
ICMP filtered · service up (HTTPS 200) instead of the two bare facts. The echoes keep going in the background, and a reply that does arrive replaces the reading.
Changed
- The destination’s own row is highlighted on every hop table, in a colour the status palette never uses, so it is distinct from a culprit row in both light and dark. A row that is both keeps the culprit’s edge.
1.22.2 2026-09-22
Fixed
- A path you have just walked shows its operator names at once. The service caches every lookup (and keeps it across restarts), but the per-hop frames a reader watches fill in could only wear what an earlier round of the SAME walk had learned — so running one trace twice in a minute left the operator and name columns blank for a whole round both times, although the answers were already in memory.
- The MTR table no longer flickers between two walks. Every walk on the wire now names its run, so a path tab and an agent sweep measuring the same host can no longer overwrite each other’s rows.
- A transit router is no longer blamed for a destination that answers nothing. Loss "affects you" only when it reaches a destination the walk actually reached; a hop that answered nothing is configuration, not loss, and is never treated as evidence that loss continued.
- A walk that never reaches its destination says so, and points at the furthest router that did, instead of reporting the last TTL it probed as though it were the destination.
- The silent tail folds: twenty "no reply" rows become one that names the range, with the first two kept.
- Jitter is an em dash where there were fewer than two replies — on every hop table and in the text report.
- The console’s hop table lists every equal-cost responder (it counted them), and says "no reply" rather than 100% for a silent hop.
Changed
- A host that answers no ping is asked over the web at the end of its first round, not its third: a sweep row reads "no ping reply · service up (HTTPS 200)" seconds after the walk begins, while the walk carries on in case the echoes come back. Three rounds was minutes on a host that answers nothing.
- "Where it went" on the year range says it covers the last 35 days — addresses are kept a month and never folded further.
- The census settings line says what the cadence is: attempts twice a day, one list per day.
- The quota card’s code and styles, unreferenced since 1.22.0, are gone.
1.22.1 2026-09-22
Fixed
- The System page printed the provider twice — the raw registry string, "Jamii Telecommunications Limited - Jamii Telecommunications Limited, KE" — where the topbar and the hop tables already printed it once. The country moves beside the AS number.
- A period’s "everything else" was several rows ("27 others", "15 others", "26 others" …), one per five-minute window, because each window named its tail by its own count. One row now, whatever wrote it.
- A store that took the v12 step without the
image column (a development box only) repairs itself on open rather than failing every window.
1.22.0 2026-09-22
Added
- Every diagnostics upload says what machine it came from: Windows edition and marketing version, the exact build with its update revision, the processor, cores, fitted memory, maker and model, uptime. Facts about a product, never a person — no machine name, user, serial or address.
- Admin → Diagnostics is its own console tab, with the issues, the raw event stream (by level, kind and window, searchable) and the lifecycle counts per version, re-read every minute while open.
- The Usage page reaches back a year. The applications table offers six hours, a day, seven days, a month and a year (then the live window); the history chart has a year too. Older five-minute rows fold into days as they are pruned, so nothing is lost and nothing grows without bound.
- Applications wear their icons in the usage table, taken from the running program on this machine and remembered; a relative meter under each row shows which is big without inventing a share.
- Ping has the agents’ host menu the path workbench had.
- A sweep row says what the web said from the fourth round: a host that answers no echo for three rounds is asked over HTTPS and HTTP once, on every interactive walk, and the row reads "no ping reply · service up (HTTPS 200)" instead of "not yet reached" for a hundred rounds.
Changed
- The data-quota card is gone and the Usage page is one full-width column. The "Quota used" alert metric left with it.
- Dropdown lists take the theme’s colours in both light and dark.
- A hop that answered from more than sixteen addresses no longer has its whole telemetry batch refused: the agent keeps sixteen and the cloud truncates rather than rejects.
- "Could not resolve host" carries the resolver’s own reason; one or two failed uploads during a redeploy, a stop-all, and the pack budget dropping hosts are no longer filed as fleet issues.
1.21.0 2026-09-22
Added
- A host that answers no ping is asked over the web, everywhere. The rule already held on the path workbench and the agent sweeps; it now holds on the Ping page (a box whose destination never answers says "no ping reply · service up (HTTPS 200)" after three timeouts), on the Internet Metrics board (a silent host’s row says the site is there and only its ping is dropped, rather than "no reply yet" for ever), and in the Link Troubleshooter — where three internet operators that answer no ping but answer over HTTPS is now reported as ICMP filtering, a warning that the ping-based figures cannot be trusted on this network, instead of an outage.
- NETStats is a living ledger. Switching the order, the period or a weight re-folds the same rows and you watch each host move to its new rank instead of the table blinking; every score and figure rolls to its next reading; and a host opens its own analysis in a drawer — daily round-trip and loss with a gap for any day nobody measured, the trend, a level shift, the days that stood out, and whether the rest of the band moved with it — the one-click-deeper the console already had.
- The Link Matrix leads with a ring, the same one the Overview’s score wears: it sweeps in, re-sweeps when the score moves, and the figures roll to their next reading instead of jumping.
Changed
- Helix’s own measurement servers are named by city, never by address, on every screen: hop tables, sweep rows, ping and path tabs, the history. The "Helix infrastructure" entry has left the Browse targets catalogue; the same server is still measured continuously on the Overview and by its agent pack.
1.20.0 2026-09-22
Added
- Each part of the app has a colour, and the page you open carries it. The navigation groups its pages by what you are doing — Observe, Investigate, Measure, Instrument — and each group now has its own hue: on the navigation icon, on the group heading, and on the card that names what the page is about. Where you are and what the navigation said about it read as one colour. The four hues come from the chart palette that was already checked for every common form of colour blindness, and every one is measured to read in both themes.
- Checkboxes and the theme choice are drawn by the app now, in its own colours, rather than left to Windows. They were the one control on every screen that looked like a web page.
- The ping log shows each reply as a bar beside its figure — the reply’s share of the slowest one this box has seen — so a spike reads as a long bar without a number having to be read.
Fixed
- Every switch in the app was slightly too wide and slightly grey, on every page, because a progress-bar rule shared its name with the app’s segmented control and won. The usage ranges, the Link Matrix views, the Ping frame sizes and the settings switches are the shape they were designed to be.
- The live strips no longer flash "no probe has reached" over a full chart for the frame the first sample lands.
- The dashboard’s empty state no longer says "No closed windows yet" twice on one row.
- The loss column on both path tables has room for its contents: the Workbench’s per-round spark ran under the SENT figure, and the agents’ table hung past its card and gave the Diagnose tab a horizontal scrollbar. The expanded hop table under a host row is also the width of its card now, not its card plus its indent.
- When a destination stops answering pings, the Workbench’s note that it switched the web checker on by itself takes its own line instead of pushing the Tracing, Stop and Browse targets buttons to a second row; and the destination’s state cell says "silent" rather than running over the loss badge.
- The Settings panel opens level: its section rail was pushed 16px down on every open, the current section’s label sat one pixel to the right of the others, and the add-a-host form stretched its probe switch and its Watch button to the full form width.
- An open feedback conversation shows its subject and whether it has been answered, where it used to open under a bare back button.
- The Live Path page’s two panel titles are on the type scale and in the app’s heading face; they had fallen to the browser’s default.
- The System page’s log-path fact is set as a path, not as a display figure that broke across two bold lines; the LAN table’s router row is one tint, not seven.
- The custom-pack form says what it is — "Add a pack", or which pack is being edited — where it sat untitled under the last saved pack.
- The Link Matrix’s level bars settle on the compositor, like every other bar in the app, instead of re-laying-out the row on every frame.
- The finished speed-test readout no longer runs into the dial’s "1000" tick; every button darkens a shade while it is pressed.
1.19.0 2026-09-21
Fixed
- Your connection to your own router is measured again after you move. The agent picked your router’s address once, when it started, and kept asking that one — so a laptop carried between networks went on probing the router of the network it had left, and recorded every reply as lost for as long as it ran. One machine that changed networks five times in an afternoon reported its local connection as completely down for ten hours while it was working perfectly. The address now follows the machine, and the figures it had been spoiling — your local link’s quality, and the loss headline on your dashboard — are honest again.
- The dashboard says when it cannot read its own history, instead of reporting that it has none. A window that could not reach the service showed the same words as a service that had only just started, which is what hid the fault above: a machine with thousands of measured minutes said it was waiting for its first.
Added
- Helix’s own measurement points now walk the path to each host they test, not just time the round trip. That fills the route part of the public rankings, which had been absent on every host because nothing had ever measured it. Where a router on the way answers nothing, it is shown as silent rather than blamed — the same rule your own agent uses.
1.18.1 2026-09-20
Changed
- Every agent contributes anonymously from its first start. It enrols itself under an account nobody can sign in to and uploads what an enrolled agent always uploaded — measurements under your network’s provider, traces, speed tests, its own warnings — so the public rankings and your provider’s figures include your line without an account. Settings → Sharing turns it off, which deletes the anonymous account and everything under it; connecting your own account replaces it. The downloads, docs and privacy pages say so in the same words.
Fixed
- An agent no longer reports a change of provider that did not happen. A public-address or registry lookup that failed for a moment used to blank the provider, and the next poll announced the same provider as new; every service start did the same from a blank slate. A lookup that fails now keeps what it cannot contradict, and a restart inherits the last identity, so the timeline records a provider change only when a lookup answers with a different one.
- The installer’s outcome reaches the cloud. It was written after the service had already started and looked; it is written before.
- The mid-update staging lock is no longer filed as a problem. It is expected on every hop and cleared two minutes later; only the retry’s failure is a warning.
1.18.0 2026-09-20
Added
- Agents send what went wrong, and the console files it. Every warning and error the service logs — an update refused, a trace session that would not open, a census that never sent — is scrubbed on the machine (no addresses, no hosts, no profile names), collapsed so a loop is one event with a count, and sent with the lifecycle records it is read against: service started, applying an update, update completed, install completed. The console’s Admin tab files one row per problem however many machines hit it, to be acknowledged or resolved with the release that fixed it; a later release firing the same problem reopens it on its own. The installer leaves a one-line outcome the next service start reports.
- The service writes a log file at last.
%PROGRAMDATA%\Helix\logs\service.log, rolled at two megabytes with one predecessor, in service mode as well as console mode. Until now the service that runs on every machine logged nothing.
Fixed
- The NETStats tables ran their Network and Provider columns over their neighbours. Both tables took the hop tables’ fixed layout without column widths, so every column was the same width; each has its own widths now and the name column takes what is left.
1.17.0 2026-09-20
Added
- NETStats lists the hosts people use most, and says how each one serves. The order is the host census — how many machines’ applications actually reached each host — and the score is the quality it earned, so a popular host with a poor connection sits at the top where it belongs. “Best score” reorders in one click, and every row shows its position by score as well. Hosts the census finds popular and answering join the fleet’s measurement list on their own.
- An ISP tab on NETStats. Each provider’s customers’ own probes to the public anchors, folded behind a people floor, rated the way every subscriber’s line is rated — calls, gaming, streaming as a word and a number — and ranked best first. A provider below the floor is listed with its counts and the reason, never hidden. On the desktop and the console.
- Subscribers’ lines now weigh on a host’s availability, at half the weight of a probe box and only once enough different people have measured it. Every row says whether they counted.
- A dead line never reaches a ranking. A period in which a machine lost every probe to every anchor at once is a cable, a lid or a radio, not a fact about a host or a provider, and it is left out of both folds before anything is summed.
- The System page says whether per-application usage is being collected, and why not when it is not, and the Settings census section shows what the last contribution attempt came to. Both were silent before.
Fixed
- NETStats scored latency and consistency as absent on every host, because nothing ever enriched a target with where it was. Targets are enriched at every fold now, and the distance band comes from a stated country-level precision.
- The host census’s hygiene job had failed on every run since it shipped: its host snapshot was never copied into the container image. It is now, and a test refuses the next data file that is not.
- The Network column on hop tables was the narrowest column with the longest text. It takes the remainder of the table now; addresses at an equal-cost hop stack one per line; operator names are cut at a word past a stated length with the full name one hover away; and the country code after the flag is gone, since the flag is the code.
1.16.0 2026-09-20
Added
- A host that answers no ping is asked whether its service is up. In a trace, three rounds with no reply from the destination switch the web checker on by itself, and the box says so. In a sweep, every host the walk did not reach is asked once over HTTPS and HTTP, and its row says what came back — “no ping reply · service up (HTTPS 200)” — instead of a loss figure that is 100% by construction. A 403 is a working server and reads as one.
Changed
- The Agents page has one Status column. “Right now” and “Last finished run” were two columns for one question, and a walking agent read “no run yet” beside “walking”. A row now says one thing: walking with its bar, what the last run found, or “never run”. Columns are fixed and left-aligned so values line up under their headings.
Fixed
- Every page reads as plain sentences. A sweep of the whole app for robotic wording: fractions became “3 of 60 lost”, wire names became words (“Your ISP’s line to you”, not “isp access”), truncated NETStats headers became real words, and every quiet panel says what would fill it and where to start.
- Hop tables no longer move while a trace runs. Every column has a declared width now, so a hop gaining its name, a figure gaining a digit or a state changing word cannot push the columns beside it. A value that outgrows its column wraps downward instead. The same rule on the Agents’ hop tables.
1.15.1 2026-09-20
Fixed
- The destination’s name no longer blinks in a live trace. The name under the final row appeared with each completed round and vanished with the next hop that landed, moving the table four times a second. Names learned in one round are now worn by every frame after it, on the service and in the app, so the subrow shows once and stays.
Changed
- The Agents page says what it means. The at-a-glance table has headed columns (Agent, Last finished run, Standing, Right now), so a pack that is walking no longer sits beside “not run yet”; the sweep strip reads as sentences (“7 of 10 hosts done · 2 walking now · 1 of 45 probes lost · slowest hop 146 ms · about 1 min 40 s left”); a finished host reads “finished”, not “walked”; and the two controls that were both called “continuous” are told apart — “Measure continuously” is the service’s standing plan, “Repeat while open” is this window’s loop.
1.15.0 2026-09-20
Added
- The Link Troubleshooter measures the radio and the throughput. Two stages that said “skipped (not implemented)” do their job: on a Wi-Fi link the Wi-Fi stage reads signal strength, the negotiated rates, the channel and the 802.11 generation from the adapter and warns on a weak radio or a fallen-back rate; on a cable it says so. With “Include speed test” ticked, the throughput stage runs the speed test and grades bufferbloat, with the measured figures in the report. The network’s name and the access point’s address never enter a report.
- Your addresses, on the Overview. To the right of your network’s name: the public address the internet sees you behind, and this computer’s own address on the link it is using (“192.168.1.24 on Wi-Fi”), each with a Copy button — the two things a support desk asks for first. The local one is the route table’s answer, not a list of every adapter, so a machine with a VPN or Hyper-V shows the address that is actually on the path.
Changed
- Who-owns-this-address lookups are cached properly, on the machine and in the cloud. The agent keeps one cache for every lookup it makes (hop operators, usage peers, your own line’s network), saved to disk so a restart re-asks nothing, served while it refreshes, and remembering a failed lookup for an hour instead of asking again on every round. The cloud’s shared cache answers from memory, refreshes a day-old entry behind the response instead of making you wait on it, and shares one lookup between agents asking at the same moment.
- Hop tables lead with the address again; the name is on hover. A hop’s reverse DNS name shows when you hover it. The destination — the last row of a trace that reached it — shows its name in a line of its own under the address, since that is the name that says which server answered. The addresses column keeps one shape from row to row.
- The console is a Next.js app. Every page at monitor.helixaicloud.com — the dashboard, the ISP portal, the operator estate, pairing, claims, invites and recovery — is built by Next.js from one shared chrome and a body per page, and served by the API at the same plain addresses as before. Nothing you can see or do changed; what changed is that there is no longer a hand-written copy of the header on twelve pages to drift apart. The marketing site made the same move on 2026-09-03.
Fixed
- The public NETStats page answered “not found” at its own address.
/netstats is the one console page a search engine may index and the one URL in the console’s sitemap, and the address answered the API’s 404 while /netstats.html served the page. Found by probing every page address against the new build; pinned so a page without an address fails the suite.
- No address on the console ends in ".html". The app’s "Connect to Helix" opened
/pair.html; invite emails carried /invite.html?token=. Every page has a plain address (/pair, /invite/<token>, /portal) and those are the only ones the product hands out now. An old link, bookmark or a previous app version still lands: the file form answers with a permanent redirect to the plain one, and a pairing or claim code in the address survives the hop.
- A fresh install’s Overview drew its "no closed windows yet" note twice, one of them a word per line across the next card. The score card’s empty state laid its three parts out in a row and the last of them spilled past the card. It is one column beside the illustration now, the way the scored card already was.
- NETStats no longer says "not enough vantage points" when the points are up and the first day has not folded. Rankings are computed over completed days, so on the day the fleet comes up every page showed two vantages and an empty table under the wrong banner. The cloud now says which of the two states it is in, and the app shows "Measuring · nothing folded yet" with when the table fills.
1.14.0 2026-09-19
Fixed
- NETStats in the app printed "TypeError: Failed to fetch". The rankings page reads the public figures from the cloud, and the app’s own content policy had no rule allowing it to ask — the WebView refused the request before it left the machine. The rule is there now, and if the page ever cannot reach the cloud it says which host it could not reach and that the request did not leave this PC, rather than printing the browser’s error.
- The Helix Vantage chart drew dashes. Both measurement points are plotted on one timeline, and their probes deliberately leave at different instants — so at every instant one city had a reading and the other had a gap, and the chart, which refuses to draw a line across a gap, drew almost nothing. A gap between one city’s own consecutive samples is now bridged; a lost probe still breaks the line, because a line across a lost probe is a reading nobody took.
- The Overview’s live strips stopped painting while a sweep ran. Every landed probe of every host in a sweep sent the whole hop table to the app — about 135 frames a second, 300 KB/s of text, each one an event into the window — and the strips, which paint on the same thread, fell silent for as long as the sweep lasted. Mid-round frames are paced to four a second now; the table still fills hop by hop and the round’s own frame is untouched. A strip that opens onto samples already collected shows its figures at once rather than waiting for the next probe.
- A destination that stops answering no longer grows the path. When a host went quiet mid-trace the walk probed on to its limit and every step past the host became a "no reply" row — an outage at hop 8 read as a thirty-hop path, and the culprit marker moved to the last of them. Those rows are dropped as the probes-into-nothing they are; the loss stays on the destination’s own row, where it belongs. The header, that row and the ping strip now say silent · N rounds instead of holding "destination reached" through the outage, and everything reads as before the moment the host answers again.
Changed
- "Helix measurement points" is Helix VANTAGE on the Overview.
- The speed test names the place it ran against, and shows who ran it. "edge MBA" is an airport code; it now reads Mombasa, Kenya with the flag, the code kept beside it, under Cloudflare’s own mark. A code the app does not know prints as the code alone rather than a guess.
1.13.1 2026-09-18
Fixed
- The installer no longer depends on a runtime Windows does not ship. On a machine without the Visual C++ Redistributable, installing ended with "Service registration failed with code -1073741515": the monitoring service needed
VCRUNTIME140.dll, which arrives with other software rather than with Windows, and could not start at all. Every earlier release had the same dependency; most machines already had the file from something else, which is why it was not noticed. Both programs now need nothing installed first: everything they load ships with Windows.
- If an update left you with no monitoring, this is the recovery. The automatic update removes the previous service before registering the new one, so a machine without that runtime was left with the new files and no service — the app shows "local only" and nothing measures. Download and run this installer once; it registers the service and the automatic updates resume from there.
1.13.0 2026-09-08
Added
- Where your connection sits relative to the places Helix measures from. The Overview now ends with both Helix measurement points — Falkenstein and London — with their round-trip time and loss updating live and both plotted on one graph. The rankings you read on NETStats are taken from these two boxes, and this is how far your line is from each of them. They are named by city, because a city has a distance you can check the number against.
- Per-application usage over time. The applications table answered for the last five minutes and nothing else; it now defaults to the last six hours, with a day, a week and a month beside it. Live stays first, because it is the only range that can show each application’s share of the total — a share is measured against the interface counter for the same window, and past windows do not keep one, so the historical ranges show an em dash there rather than a figure nobody could check. All of it stays on your machine, and it is deleted after thirty-five days.
- A hop that answers from more than one router shows all of them. On an equal-cost path the router that replies is whichever one the traffic hash picked, and the tables used to print the first with a count of the rest — "ECMP ×2" — which said there were others without saying what they were. Every responding address is listed now, each with its own name, on all four screens that draw a path. Saved traces keep them too, so the report you send an ISP carries what was on screen.
- Every hop on a path says what it is called. Reverse DNS runs alongside the network lookup that was already happening, so a hop reads as its own name where it has one, with the address a hover away. The name is often the only thing that says where a hop is: an AS number and a country cannot tell two cities of one carrier apart.
- Helping decide which hosts are worth measuring. Once a day Helix sends a list of the services this machine moved the most data to or from — a domain such as
example-cdn.net, or a network block where no name answers. Nothing else goes with it: not which application, not how many bytes, not when, and not individual addresses. A service is only counted once at least five separate machines have named it, and services that moved very little are left out entirely, which is the part that keeps the list from describing you: the unusual services are almost always the small ones. This is on, and turning it off is one click — Settings has a section of its own for it, What this machine shares, which states what is being sent before it offers the switch and says plainly when the machine is contributing because nobody has been asked rather than because somebody agreed.
- How a host has been behaving, on the rankings. For any ranked target: which way its round-trip time has been moving, which days were unlike the rest, when its level shifted, and — the one that matters — whether its bad days were its own or shared with everything else measured beside it. There is deliberately no forecast: a predicted figure is not a measured one.
- The Web Checker: ask a destination that ignores pings. Large services routinely answer no ping, which makes a path walk end in silence and says nothing about whether the service is up. Tick Web Checker on a trace and every round also asks the destination over HTTPS and HTTP, reporting what it answered with the response time, average, best and worst — on a line under the hop table, in the same columns, so you can read the service against the last hop straight down. It reports the service, not which hop a connection reached, and says so: per-hop attribution is not possible on Windows without bundling a driver that may not be shipped, and a column that cannot answer would be a number with nothing behind it.
- Internet Metrics: how far away the internet is, from your line. A live board of the services most people actually use — resolvers, search, AI assistants, meetings, social, news, vendors — each with its round trip as a bar you can compare across the whole board, lowest first. Hovering one gives the current, average, lowest and highest reading and how many probes are behind them. Beside each bar sits the same host measured from Helix’s own probe boxes, which is the point: slow in both places means the service is slow, slow only from here means the path is. It lives beside the Link Matrix, which answers the neighbouring question about your own connection.
- A destination that answers no ping is asked again while you watch. The standalone check sends its own echoes alongside the connection attempts rather than trusting the walk that just finished, so a host that dropped packets during a bad thirty seconds is not described as filtering them for as long as the report is open. It reports three states, not two, and where only some echoes come back it says the path is losing them — from one end of a walk there is nothing to separate that from the host dropping them, and the host is the party with no chance to answer back.
- A dedicated health view for the platform operator. Whether the cloud tier is well, and whether each measurement point is still measuring, in one place. It reports ages rather than verdicts — agents batch their uploads and the daily rollup re-computes three days, so a box a few hours behind has lost nothing — and each state says which threshold was crossed and what it costs. It also tells apart a measurement point that has stopped from one that was never finished being set up, which used to look identical.
- A way to sort out an AS number that is already registered. If registration says your AS number is held by somebody else, or you have lost access to a registration that is yours, there is now a form for it on the sign-in page rather than an instruction to find an email address. The refusal opens it for you with what you typed already filled in. It goes to a person, it changes nothing on its own, and re-sending it adds to the same appeal rather than opening a second one.
- Providers can see which of their own service IDs are sharing. One row per connection whose subscriber turned sharing on, keyed by the account number the provider issued themselves. Subscribers who run Helix on that network and have not shared are counted and never named — the count is there so a short list does not read as everybody, and they are not named because that would report somebody’s decision to the party they declined. It is not a list of machines, and there is no device, hostname or address in it.
Fixed
- Five hosts that never answer a ping are back in the agent packs, and no longer read as your line losing every packet. Netflix, PlayStation, Nintendo, Epic Games and Slack serve the web perfectly and answer no ping at all, so a sweep used to score them at 100% loss — false about your line rather than true about theirs. The packs now know which of their hosts do that: those rows check the service over HTTPS instead and read "serving, answers no ping" with the response time, rather than a loss figure the measurement never earned.
- Signing in said "connected" while the app still said "sign in". The browser pairing finished and started uploading, but never actually recorded the account: the app went on showing "local only", and restarting the service dropped the connection entirely without saying so. Pairing now stores the account the same way pasting a token always has.
- DNS never finished measuring. The resolver row on the Link Matrix sat at "gathering, 6 of 20 probes" for ever, because each check replaced the previous count instead of adding to it. It adds up now, and the level scores.
- The Link Matrix shows what each level was measured from — every host, with its own probes, losses and median, under the bar it contributed to. Those figures always existed; only the summary ever reached the screen.
- NETStats works without an account. The rankings are public and need no sign-in. The page says which host it read them from, and that nothing about your machine is sent to fetch them.
- The public rankings page rendered its own explanation unstyled. The box that says why nothing is ranked yet used a style name that exists nowhere, so it appeared as bare text on the open web.
- Paragraphs use the width they have. The line-length work in 1.12.0 was applied too tightly: notes inside wide cards were held to about a third of the space available. Long-form reading keeps its measure; a one-sentence note in a card no longer does.
- Three smaller layout faults: the responsiveness figure overlapped the ring drawn around it, the live charts ended before the description beside them did, and an operator name ran into its AS number on the rankings table.
Changed
- Text uses the full width of what it is in. Paragraphs across the app, the console and the site were capped at a reading measure, which left narrow columns in wide cards; the caps are gone and the hero on the Internet Monitor page is laid out across the page rather than beside its illustration.
- Both sites say what may be indexed. The console now serves a sitemap and refuses indexing by default for everything that needs a session — password reset, pairing and the operator console were all previously crawlable. The public site gains structured data and richer link previews. No page carries an invented change date: a sitemap timestamp is a claim about when content changed, and the only date a build knows is its own.
- The mean rating sits with your provider’s name, as a pill beside the AS number and country, rather than in a column of its own. What the figure is made of is still printed beneath it.
- NETStats is linked from the Internet Monitor page and the home page, not only from the product menu.
1.12.0 2026-09-07
Added
- Your router, named. The devices list under System can now say what a device is, not only who made it: a product family, where its settings page usually lives, and whether it is the kind of unit an internet provider hands out. Two sources answer, and the app always says which — a curated Helix catalogue entry, or a language-model suggestion that is labelled unverified and names the model that made it. Only the vendor prefix of an address is ever asked about, and the question is asked by the service on your behalf: your MAC addresses, your IP addresses, your hostnames and how many devices you have never leave the machine. The deeper lookup is its own separate button, so it only ever happens because you pressed it.
- NETStats folds itself. The rankings pages had the fleet, the scoring and the public read, and nothing writing the daily rollup they read. Vantage points are now enrolled, weighted, retired and folded from the operator console, and their ordinary measurements become the daily rows the rankings are computed from — a vantage is still just an enrolled agent with a flag, with no separate credential and no separate wire.
- Feedback is a conversation, and somebody answers it. "Report a problem" used to send one message into the dark. It is a thread now: you write, Helix replies, and the reply arrives where you asked — in the app, in your account online, or in the ISP portal. The desktop flashes the tray when an answer lands, even with the window closed. You can attach screenshots on either side of it, up to three at a time, and both sides get an email when a message arrives — a notice saying what arrived and where to read it, never a copy of what was written. This is still not a support ticket: it goes to the people building Helix, never to your ISP, and there is no clock on it.
- NETStats: global host rankings. A new page on the desktop, the console and the website, ranking the hosts the internet runs on from vantage points Helix operates. Five weighted components you can re-weight yourself, counts beside every figure, and a host measured from too few places is listed with the reason it is not ranked rather than given a number nobody could defend. Subscriber measurements are deliberately not in it.
- Sign in from the top right. Connecting an account was reachable only from Settings. The button starts the same browser pairing the service already owned — so the desktop never sees a credential, whether you use Google, a Helix password or a Helix NMS account — and the menu links out to the website and to Helix AI Studios.
- The Overview says what it is measuring. Each live strip now leads with who runs that address: the operator, the AS it is announced from, its country, what the address is for, and why this product watches it. The gateway strip shows your own router — its vendor, and whether this machine reaches it over Wi-Fi or a cable, read from the OS rather than guessed from an adapter’s name.
- A LAN devices list, under System. Every device this machine has already resolved: address, MAC, hostname, vendor and link, with the router first. Nothing is scanned — it is the address table Windows already keeps — and the list never leaves the machine. An optional toggle, off by default, says when a device joins.
- The Workbench is now MTR Trace -- in the rail, on the page and in the Live Path pointer. The name says what the page does.
- A multi-tab MTR Trace, every tab its own session. Each tab is an independent MTR session the service starts, tracks, re-walks (non-stop) and lists; two tabs at one host are two walks; Stop on a tab stops that tab; closing a tab stops its walk; leaving the page and coming back finds the tables intact and the walks still going, and an app restart re-attaches to whatever the service is still walking. The idea of attaching to a run something else started is retired.
- Hop tables fill hop by hop. The service reports each hop the moment its probe lands, inside the round, and the round’s frame follows with the operator names. A path with a silent router used to show its first row only after that router’s timeout.
- Ping boxes are remembered and re-attached from the service’s own list of running boxes, so a box left running on another page can be seen and stopped again.
Changed
- Small text is bigger, and prose has a line length. The bottom of the type scale was carrying more of the product than the body size was, across four steps where two were nearly the same size. It is re-cut so every step has one job, the smallest text on any screen went from 10px to 11px, and notes and explanations moved up a step to where sentences belong. Paragraphs no longer run the full width of whatever card they sit in — a long line loses the eye on the way back to the left, and this affects all three of the app, the console and the website. Dark mode gets slightly more air between lines and letters, because light text on a dark ground reads heavier at the same size.
- The apostrophes are typographic now. Sixty-eight of them, plus seven quoted phrases, were still typewriter marks in shipped text across the app and the console. Quoted phrases in the app’s own screens are now checked too, which the first pass had left to the author because it could not tell copy from code.
- The Overview is a living instrument. The responsiveness score is drawn as well as printed: a ring sweeps to its value on first paint and re-sweeps when the score changes, in the number’s own grade colour. Every hero figure rolls to its next reading instead of jumping, the hour-sparklines draw themselves in, the identity band carries a heartbeat that beats once for every probe that lands (and in the down colour for one that does not), and the live strips stream: a fixed window of real time glides past at probe cadence, so the newest sample enters at the right edge rather than the whole picture stepping once a second. Nothing is interpolated or invented; under reduced motion every movement is a cut. The "canonical · closed 1-min windows" caption became the tile group’s name.
- The Link Matrix measures every level on its own, from the moment the service starts. The ISP-gateway level -- "measured by path walks" and otherwise absent until now -- is fed by every path walk that finishes anywhere in the service: the startup sweep, any pack, the Workbench, the scheduled trace, and a short unattended walk the matrix now runs for itself every five minutes. It takes the first public hop that answered; loss that stops at a rate-limiting router is not charged to it. The resolver check runs every five minutes (was ten).
- The Agents cockpit updates in real time. Hosts finished, the phase word and every cockpit figure move the moment a host completes, with a one-second reconcile while anything is running; the page’s own text says what the agents now do. The saved-workflows card and the DNS checker are gone from the tab (the resolver check still runs by itself for the matrix).
- Every workflow has its own Stop, and the global Stop is gone. The topbar’s "Stop all" is removed. A path tab stops its own walk, a ping box its own echoes, and the Agents tab’s "Stop all agents" stops every agent in flight and nothing else -- then offers "Resume" to run exactly those agents again.
- Diagnose stage results are hairline rows and the verdict is a section of the page rather than a card in a card; the Workbench legend is one wrapped row and its hop rows are shorter.
Fixed
- The alert rule dropdowns on Usage could not be clicked. A charting library bundled for the same page defines a class by the same name as the one those controls used, and its rule made them invisible to the mouse and stacked them on top of each other. Choosing a metric or a comparison for a rule was impossible. Renamed, and the row lays out correctly again.
- Three tables had a column under the wrong heading. On the LAN devices list, the Workbench and NETStats, one cell in each row had been styled in a way that quietly removed it from the table — so every column after it shifted one place left and the last heading sat above nothing. On the LAN list that meant "last seen" was printed under "Link". Found by measuring the rendered pages rather than reading the stylesheets, which is also how the next two were found.
- Long paragraphs are capped everywhere now. Nine places across the app, the console and the website still ran prose the full width of whatever box it sat in — the worst was a diagnosis verdict at 189 characters a line, on the one panel asking you to follow an argument. A line that long loses the eye on the way back to the left.
- Some form fields were smaller than the ones beside them. Text boxes written without an explicit type — including several on the operator’s release panel — were missing the house styling entirely and rendered 16 pixels shorter than their neighbours in the same row.
1.11.0 2026-09-05
Added
- A change of link is a network change too. Moving from Wi-Fi to Ethernet through the same router -- same gateway, same provider, same address -- now flashes the tray and shows the card ("Now on Ethernet 2 -- a different link, same network"). Nothing about the connection’s identity moves.
- The Agents cockpit moves. Click a running sweep in the launcher and its row morphs into its card; open a host and its row grows into the hop list. The figures on the cockpit strip roll to their next value instead of jumping, the progress bars settle instead of stepping, the all-sweeps strip stays with you as the page scrolls, and under each running agent a wire strip draws every round as a tick, one lane per host, red where the destination lost the echo. Every motion respects the reduced-motion setting.
- Agents: one row per host. While a pack runs, each host’s row carries its round, its own progress bar and, opened, its hop list as it fills. The cockpit strip says how long the slowest path has left. The second list of the same hosts beneath the card is gone.
- Usage: applications and hosts as a pair of tabs, so the page is no longer two wide tables stacked.
Changed
- The three sweep buttons are one row; their explanation is on hover.
- One card-title size across the desktop, and the ping frame presets, the settings switches and the hosts grouping share the segmented control.
- One text field and one table header across the desktop: every input and select shares a ground, an edge and tabular figures, and every hop, host and system table carries the same small uppercase header -- the Workbench’s was the one Title Case header on the app.
- One button and one segmented control across the desktop: the troubleshooter’s tabs, the usage ranges and the attribution tabs share a shape, and the speed-test, consent and copy buttons are the house buttons.
Fixed
- Releases register within a minute of publishing, and cannot be rate-limited into not registering. The cloud learns the newest release from GitHub’s own redirect (no API quota) and asks the API only for a release it has not seen. The two-minute API poll that 1.10.1 shipped with hit GitHub’s unauthenticated limit within the hour and answered 403 on every tick; cloud-side only, nothing to install.
1.10.1 2026-09-05
Changed
- Updates arrive faster. The service checks for a new version every minute instead of every three, and the cloud notices a published release within two minutes instead of ten -- a fix now reaches a running machine in about two minutes from publish, under five at worst.
1.10.0 2026-09-05
Added
- A startup sweep. Thirty seconds after the service starts it runs the Quick sweep once -- resolvers, Google, Meta and social -- so the Agents page has a picture of the line before anyone presses anything. It stands down if a sweep is already running.
- Ping shows the TTL each reply arrived with, beside its round-trip time -- distance in hops, read off the packet.
- The installer downloads under one name,
HelixInternetMonitor-Setup.exe, whatever version it carries. The version is in the file’s Properties and on the download page beside its checksum.
- Every network change flashes the tray icon -- a different provider, a new public address, or a different gateway (another Wi-Fi network, a VPN taking the route). The card that comes with it can be switched off in Settings > Notifications; the flash cannot.
- Colour-coded readings on hop tables and ping rows. Worst round-trip, jitter and loss on every hop, and each ping reply, carry a glyph, a colour and a word on hover saying what the figure was judged against -- always the line’s own baseline, never an absolute scale.
- The Agents cockpit. A running or finished agent opens with a strip of live figures -- hosts finished, paths measuring, echoes lost, the slowest hop by name -- and the per-host live paths fold beneath it. The sweep launcher carries the same strip across every sweep in flight.
- Custom packs have their own tab under the Troubleshooter.
- Usage opens with six counts -- today, 7 days, 30 days, the busiest quarter-hour, upload share and the busiest application -- above shorter charts.
- The Overview leads with Cloudflare, above the gateway, and its hero is one row: six tiles including the slow tail (95th percentile) and the probe count behind the figures. The live strips sit about 100 px higher.
- Light is the default theme on the website too, matching the app and the console; dark stays one toggle away.
Fixed
- Running agents show their rounds, not "starting…". A pack’s row only moved when a whole host finished, and a host takes about a hundred seconds, so every sweep looked stuck for its first two minutes. Rows now read the host and round in progress with a real progress bar.
- Stop All marks every running sweep "Stopping…" at once, and a row that says "Stopping…" stays that way until the service confirms the stop -- it used to flip back to "Stop" a second later.
- Usage history drew no bars for the day. The "Today" view asked for one-minute detail, which by afternoon is hundreds of bars thinner than a pixel. It now shows fifteen-minute bars.
- Hop tables no longer print an operator’s name twice ("X LIMITED - X LIMITED") on the Agents, Workbench and History pages.
1.9.0 2026-09-05
Added
- A Ping page. A shell of independent ping boxes, each with its own host, a count or continuous choice, an interval, a frame size (with the common presets, 32 bytes to a full 1500) and a "don’t fragment" switch — the path-MTU probe: a frame too big to pass a hop whole comes back as too big rather than as ordinary loss. Boxes run side by side, so the same host at two frame sizes is one click apart. Loss is shown as counts until 300 echoes, then as a rate.
- Custom packs can be edited, and run. Your own host lists — saved on this machine, validated as you save them, run and stopped like the built-in agents, with the same live progress. (The saving half had shipped in 1.8.0 with no screen for it; and a saved pack could not be run on demand at all, nor did a "continuous" one ever run twice.)
Changed
- One reading, not two. The Home / Operator switcher is gone from the desktop. The app always shows the fuller view: live strips first, every probed target, raw figures. Nothing was gated behind a mode; nothing is now.
- A cohesive, more compact desktop. One button system, one pill, one set of radii, status words on their own inks, inset panels that are visible in the light theme and not solid slabs in the dark one. Ten colours and sizes the stylesheets had been asking for that were never defined — square notice cards, a black spark baseline, a Stop-all hover you could not read — are defined now, and a test refuses the next one.
- Stop means stop, and says so. Every Stop reads "Stopping…" the instant it is pressed and settles on a final stopped from the service, not a guess. "Stop all" no longer restarts a continuous agent a minute later, and the Workbench’s Stop-then-Run somewhere else actually stops the first trace (a race left two walks running).
Fixed
- Nothing queues, and nothing says it does. The Agents tab’s "queued · next" labels described a waiting line that no longer exists; a running agent whose first host had not finished read as queued. The Workbench refused to trace while any agent was sweeping; it now paces through the same traffic governor the agents use.
- The per-agent "Continuous" checkbox never re-ran anything. It does.
- A host another agent was already measuring was reported as "not reached". It now says covered by another run — neither reached nor unreached.
- Settings said to download and run the installer yourself. The service installs updates in the background and has since 1.2.0; the page now says so, and links the page that exists.
- Connection errors were invisible on the Account page (they showed only inside the folded "paste a token" section), and there was no Disconnect without opening it. Both fixed.
- The Live Path panel was unreadable during a sweep — it drew every host’s rounds interleaved. It follows one path to its last round now.
- The Workbench’s service-tools card showed the previous host’s result under the new host. It clears when the host changes.
- The topbar’s run count and the System page counted one sweep and invented a queue. Both count every sweep and every ping box.
- Two more. A stopped-and-restarted ping box could become unstoppable (a stale "finished" removed the new box’s stop handle); and looking up a host name for Ping, the service tools or a custom pack could stall every measurement for seconds when the resolver itself was down — exactly when you would reach for those tools.
1.8.1 2026-09-04
Fixed
- "Stop all" now actually stops everything. With several troubleshooting agents running at once, the panic button (and the Agents tab’s own "Stop N running") cleared what the screen showed without stopping the agents underneath — so running a sweep again right after queued behind hosts that were never released. Both now stop every agent that is actually running.
- Every running agent shows its progress, not just the first one. With several sweeps going at once, only one card ever showed its live hop-by- hop detail and progress bar; the rest sat looking idle even while measuring. Every card now shows its own.
- A card’s Stop button no longer stops every other agent too. It now stops only the one you clicked.
- The live path view for a ten-host agent no longer looks like a garbled mess. Columns now line up consistently row to row, host to host, instead of shifting with each hop’s provider name.
- The Workbench no longer makes you wait to trace a different host. Typing a new host and pressing Run now switches immediately — no more Stop, wait, then Run.
1.8.0 2026-09-04
Added
- Run every troubleshooting pack at once, honestly. Sweeps no longer queue behind each other — the serial limit existed only because concurrent runs used to rate-limit each other at the shared early hops and blame your own ISP for loss the measurement itself invented. That problem is now solved properly: every host walk starts on the same measured spacing a single pack always used, and a host already being walked by one sweep is never walked twice by another. The Agents tab opens with Quick, Standard and Full — each a superset of the last — and shows one row per sweep in flight with its own progress and its own Stop.
- Name your own hosts to watch. Save a list of hosts as a pack of your own, run it on demand or continuously, and it behaves exactly like a built-in pack — without ever becoming one of the fixed target lists the app ships with. Every host is checked when you save it, so a typo is caught in the editor rather than failing mid-sweep.
- The Link Matrix’s DNS level fills itself. It used to read "runs with the resolver check" until someone pressed a button; the service now keeps it current on its own, every ten minutes. Every level’s figures are compact chips now — loss, probes, median — with a pulsing badge while a level is still gathering its first readings.
- The live bandwidth chart opens already full. It used to draw an empty plot that took three minutes to fill, even though the service had been measuring the whole time your window was closed. It now opens with the last three minutes already on screen.
- The Workbench remembers where you’ve been. The host field is a search box over your own history now, ranked by how often and how recently you’ve used each one, filtered as you type.
Improved
- A provider’s name reads once. "Safaricom Limited - Safaricom Limited, KE" now reads as "Safaricom Limited" — on the desktop’s connection identity, in the Workbench’s hop table, and on the console’s Home page and provider-claim screen. Where a provider’s handle and its proper name differ, the proper name wins.
- Every page in the console has a clean address.
/portal, /admin, /pros, /claim and /pair no longer show .html in the address bar — nor does anywhere they’re linked from. Old links you’ve already bookmarked or been sent still work.
- Loss counters stay readable at any size. A running total past a thousand now compacts (
46.6K) instead of growing a digit at a time; the exact figure is always one hover away.
- A simpler provider identity band. The row of three verdicts that only restated the mean rating beside them is gone; the mean is still computed from the same three ratings underneath.
Fixed
- Browser pairing and provider claims rendered nothing at all. Since the browser-pairing feature shipped in 1.7.0, both the pairing page and the provider-claim page have failed to render for every single visitor — a placeholder that said "Reading the code…" and never progressed. Anyone who tried to connect a computer with a browser, or accept a provider’s claim, could not.
Added
- The Helix Link Matrix. A new page that reads your connection as five levels — your LAN, your ISP’s gateway, DNS, nearby content and the international haul — each scored live from the measurements already flowing, with one overall figure weighted across whatever has been measured so far. It starts speaking within the first minute of the service running, and a level that cannot score yet says why instead of showing a dash. Every score carries its probe counts, because a figure without its sample is one nobody can check.
- Connect with your browser. Linking this computer to your Helix account no longer involves copying a token: click Connect, sign in the way you already do (Google included), approve the computer by name, and the agent does the rest. The old paste-a-token path is still there, folded away, for machines where a browser is not an option.
- Your provider can ask, and you decide on this screen. When an ISP or reseller you buy from claims your service ID, the request appears as a card in the corner of the app — who is asking, their support contacts to check out-of-band, and Accept/Decline. Accepting connects the line you actually measure; declining tells them only that the code was used.
- Messages from the operator. A short notice from the Helix operator (planned maintenance, a heads-up) can now appear as a dismissable card. It is plain text in a fixed frame — it cannot carry links or buttons, by design.
- Report a problem. Settings → About now has a feedback box: a sentence about what looked wrong, optionally with your latest diagnosis report attached so we can see what the agent saw. It goes to the people building this, not to your ISP.
- A System panel. A task-manager view of the agent itself: the service, every worker it runs (probes, sweeps, diagnosis, DNS, speed test, cloud sync, updater, pairing), what each is doing right now, and the run queue.
- Continuous sweeps. Each troubleshooting pack now has a Continuous toggle: when its sweep finishes, it queues again a minute later, along with the resolver check. Sweeps still run one at a time — parallel sweeps would measure each other.
- Helix infrastructure as a benchmark. The server this product’s own cloud runs on is now a measurable target, addressed directly by IP so the reading is the real path to our machine, not a CDN edge in front of it. If your line is fine and this path is not, the fault is ours.
Improved
- One diagnostic, shown everywhere. If a host is already being measured — by a sweep or another page — the Workbench now attaches to that live stream instead of launching a duplicate run at the same target, and its Stop button stops the run that actually owns the stream, saying so before the click.
- Every connection to the cloud rides one hardened channel. All agent-to-cloud traffic now goes through a single TLS-only transport: plaintext addresses are refused when entered, not discovered failing later, and a redirect can never downgrade the connection mid-flight.
- VPN awareness. When a tunnel adapter is up, the app says your measurements may describe the tunnel rather than your line — named as an observation, never guessed as a verdict.
1.6.0 2026-08-26
Added
- A proper application shell. Everything that tells you where you are now lives in a slim column down the left — Overview, Live Path, Workbench, Diagnose, Usage and Settings, grouped by what you are trying to do rather than listed in a row. The bar across the top is reduced to what it should have been all along: on the left, what your connection is and whether Helix is watching it; on the right, the handful of controls that change how the app looks and behaves. Nothing was removed — every page and every control is still there, and the panic "Stop all" button is still one click away from any screen.
- A map for the Agents page. The troubleshooting agents used to be a long unbroken scroll. There is now a summary at the top — one line per group, what it last found, whether it is running — and a button beside each that jumps you to it.
Improved
- The diagnosis leads with its answer. When a full diagnosis finishes, the verdict, its evidence and what to do next are now the first thing on screen. The eleven steps it took to get there fold away underneath, one click from view. Nothing about the evidence changed — both the supporting and the contradicting columns are still shown in full, always.
- The Usage page is one workflow. Alert rules have moved out of the narrow side column, where six fields never fitted, into the main column with room to work. The side column now shows your data quota alone, and both the quota and your alert rules refresh on their own instead of going stale while the page is open.
- Live Path gives the path the room. The list of routers between you and the internet — the part carrying the verdict about where trouble starts — now takes the wider half of the screen. With no trace running the page no longer draws an empty chart with nothing in it.
- Settings without dead ends. Two sections existed only to tell you something had moved elsewhere; they are gone, and what they pointed at is where you would look for it. The About section separates into three plain subjects: what is running, updates, and crash reports.
- The app fits smaller windows properly. Every screen was re-measured at common laptop sizes and at the smallest window the app allows, and the layouts now reflow against the space the content actually has rather than the size of the window.
Fixed
- Data volumes on the Usage page are consistent again. The "Where it went" table was counting in a different unit system from the rest of the page, so the same traffic could read as two different numbers. It now matches everything else — and the way your provider bills you.
- A colour that was too faint to read. The live download figure and the speed-test direction arrows were drawn in a colour tuned for chart lines, not for text, and in the dark theme it fell just below the readable standard. Both are now a shade deeper, and still match the lines they describe.
- The About section could fail to appear. If the service did not answer the update question, the whole section vanished instead of showing what it knew. It now says what it is waiting for.
1.5.0 2026-08-26
Added
- Every figure now shows its last hour. The four numbers at the top of the dashboard — latency, jitter, loss and call quality — each carry a small chart of the past sixty minutes underneath, so you can see at a glance whether the number you are looking at is normal for your line or something new. A steady line means steady; for loss, a flat baseline means an hour was measured and nothing was lost, and small bars count the probes that were — counts, not percentages, because a percentage of a minute’s dozen probes would overstate what one dropped packet means.
- Your score, once and properly. The connection score used to appear twice on the dashboard — once small, once in a card of its own further down. It is now a single large figure beside the speed dial, where it belongs, and the page is shorter for it.
Improved
- Easier to read, measured rather than promised. Every screen in both the desktop app and the web console now passes the WCAG 2.2 AA contrast standard, checked by an automated measurement of the rendered screens — including the translucent glass surfaces, which is where most of the shortfalls were hiding. Status labels, badges and the remote support consent button are all a shade deeper and easier to read, especially in the light theme.
- Panels that keep up with you. The Troubleshooter’s past-diagnoses list now stays in view while you scroll through a long report, the same way the Usage page’s quota panel already did — and both now step aside correctly on narrow windows instead of pinning to the top.
- Tidier spacing and type throughout. Both apps’ styling was measured against the design system and 127 stray values were brought onto the scale — the layout rhythm is now consistent everywhere, and the compact density setting reaches panels it previously could not.
1.4.0 2026-08-25
Added
- See how your line compares. Your dashboard now shows what your connection actually delivers next to what other Helix subscribers in your country see, and what everyone measures worldwide. A slow evening is one thing; a line that is slower than everybody else on the same network is a conversation with your provider — and now you can show them the difference instead of describing it. Every figure says how many subscribers and how many measurements are behind it, and nothing is shown at all until enough different people have contributed that no single household can be picked out of it.
- Open statistics, published. A new public page at helixaicloud.com/monitor-stats.html shows latency, loss and speed by country and by network, measured entirely by subscribers’ own agents. It carries no numbers of its own: everything is fetched live, and when there is not enough data to publish a network safely the page says so rather than showing a figure. It is deliberately not a league table — the sample is people who chose to install a monitoring tool, and the page says that above the figures rather than in a footnote.
- Your network, on the front page. The dashboard now opens with who you are paying: their name, AS number and country with its flag, and three plain ratings for what the line is currently good for — calls, gaming and streaming — measured against published thresholds you can check.
- Speed-test history, and a link you can share. Every test your agents have run is now listed in your account, and any one of them can be shared as a link. The page shows the result, names your ISP and nothing else about you, and says plainly that one test is not a verdict on a connection. You can revoke the link at any time, and the result is frozen when you share it — whoever you sent it to sees the number you quoted, not whatever you measure next week.
- Send a diagnosis to your account. The Link Troubleshooter can now hand its report to your Helix account, where you can publish a shareable link, download it as a PDF or attach it to a ticket with your ISP.
- A Stop button that stops everything. One control in the toolbar ends every diagnostic run, empties the queue and closes any live support session your provider has open. It tells you what it stopped, and it never turns off monitoring — that keeps running, because the evidence you are collecting should not have a hole in it.
- Name and service checks on the Workbench. Look up what a name resolves to on your resolver against two public ones, and check whether the service on a host actually answers. A refused connection is shown as the good sign it is: the packet arrived and the host replied.
- Country flags throughout. Every network on a path now carries its flag, so you can see your traffic leave the country at a glance rather than reading AS numbers.
Changed
- The live throughput chart puts upload and download on the same side. Upload used to hang below the axis as a mirror image, which spent half the chart on a reflection and left the smaller direction as a flat smear on most home connections.
- The speed test says who measured it. Cloudflare and the edge that answered are now shown with the result, and you can re-run from the result view. While a test runs, all three figures update live with the one being measured highlighted.
- Cleaner tables. Path results no longer wrap every number in a coloured box — colour is now used only where it means something, so the hop that is actually causing your problem stands out.
- Your data allowance and alerts follow you down the Usage page instead of scrolling away as soon as you look at the detail.
Fixed
- The ISP portal’s theme button sat in the middle of the header for every signed-in operator.
- Ending a support session from the operator’s side could silently fail and leave the subscriber’s "someone is watching" indicator on.
- Notifications on the web dashboard now match the desktop app’s, and no longer rely on colour alone to tell success from failure.
- Speed tests uploaded by agents were being stored and never shown anywhere.
- Country flags render on Windows, which ships no flag font at all.
1.3.0 2026-08-21
Added
- Live support — with your permission, and never without it. When you call your internet provider, their support desk can now ask to watch your connection live while you are on the phone. The request appears on your screen and nothing is shared until you answer. If you allow it, the engineer sees the same live readings this app shows you — latency, loss and the network path — for the number of minutes you allowed, you see an indicator the entire time, and a Stop button always works. Saying no is one click. Nothing is recorded either way: it is a window, not a recording, and it closes on its own when the time runs out.
- Live Path. A new panel that shows your connection working in real time: every probe as it happens, and the live route your traffic takes, with the same honest reading as everywhere else in the app — only the first hop whose loss actually reaches the destination is blamed.
Changed
- Update checks now run every 3 minutes, permanently. An earlier changelog said the faster checks were temporary and would return to fifteen minutes; that was wrong — the three-minute cadence is now the permanent setting. It was kept because it gets fixes to every machine within minutes, and it stays cheap: almost every check is a tiny “anything new?” request answered with “no”.
- The app and service from this release still work with the previous release during the update window — the wire between them is unchanged, as the versioning note above promises.
1.2.12 2026-08-21
Fixed
- The notification card is dark glass everywhere, not gray. On machines where Windows disables transparency effects — remote desktop sessions among them — the card fell back to a plain gray rectangle with square corners. It now carries its own colour and shape without asking the system for help.
- If the app’s window was open when an update arrived, it opens again afterwards. Previously an update that happened on its own closed the window and brought the app back only in the notification area, quietly undoing what was on your screen. The window now returns — without taking your keyboard — and if you close the app to the notification area during the update warning, that choice is respected and it stays closed. Because the remembering is done by the app being replaced, this first takes effect on the update after this one.
1.2.11 2026-08-21
The agent is functionally identical to 1.2.10. Like 1.2.1 before it, this release exists to exercise a mechanism in front of the people watching for it: 1.2.10 changed how update warnings look — the product’s own dark-glass card instead of the standard Windows notification — and the card announcing an update can only be seen while a real update is arriving. This is that update. If a glass card slides in above the notification area, names this version and counts down while the app restarts, the new surface works; if not, it is the surface that is broken and not the update.
1.2.10 2026-08-21
Changed
- Notifications now look like Helix, not like Windows. Warnings and connection findings appear as the product’s own dark-glass card above the notification area — the app’s mark, a coloured edge, and a thin line showing how long the card will stay. Hovering holds it; clicking it opens the app; the × dismisses it. The card never takes keyboard focus away from what you are doing. If the card cannot be shown for any reason, the standard Windows notification is used instead, which since 1.2.9 carries the app’s own name and icon. One honest trade, made deliberately: the card appears even when Windows Do Not Disturb would have hidden the standard kind.
Fixed
- Updates no longer leave a leftover installer copy behind. The cleanup ran at a moment when the file was still in use by the update itself; it now retries shortly afterwards.
1.2.9 2026-08-21
Fixed
- The warning before an update restarts the app now actually appears. It has been sent since 1.2.3 and never shown: Windows only displays a notification from an app it can identify, and the installed app was never registered in the way Windows checks. The installer now registers it properly, so the app’s notifications carry its own name and icon. Because the warning is shown by the app that is about to close, the first update onto this version still updates quietly; the warning appears from the next one on.
Changed
- The background service is now
helix-monitor-service.exe (it was helix-service.exe), and it now carries a proper description, publisher, version and icon — so what you see in Task Manager says what it is and who it belongs to, instead of an anonymous process. Recognisable names are part of being trustworthy software; a process you can identify is one you do not kill or report. Updating from any earlier version handles the rename automatically, and the old file is removed.
1.2.8 2026-08-21
Fixed
- The app comes back after an update. Actually, this time, and here is why it is different from the last two times this changelog said so. The reopening machinery has been rebuilt twice and each time one link in the chain had never really run: 1.2.6 built the right mechanism in the wrong order, 1.2.7 fixed the order but the step that notices the app was open could not see it from where updates run. That step read the answer to “did the app close politely?” — a question that cannot be asked across the boundary between the update and your desktop. It now asks a question that can. The difference this release: the failure was found by reading the disk’s own journal of what happened during a real update, the fix was probed in the exact context updates run in, and the put-the-app-back step has been watched working on a real machine.
Known
- The warning that an update is about to restart the app does not appear yet. The message is sent; Windows has nothing it recognises to show it as, so it shows nothing. A fix is queued. The update itself is unaffected.
1.2.7 2026-08-21
Fixed
- The app really does come back after an update now. 1.2.6 built the right mechanism and ran it in the wrong order: the note telling the new version to reopen the app was written moments after the new version had already looked for it. Updating worked; the app stayed closed. The note is now written first. This is the release where the reopened app has actually been watched appearing — as a window when you asked for the update, in the notification area when it happened on its own — rather than reasoned about.
Changed
- Updates are noticed within about three minutes, temporarily. The usual cadence is a check every fifteen minutes. During the current development sprint the agent checks every three, so fixes land quickly on the machines testing them. The check is tiny — a question to the server whose usual answer is "nothing new" — and the cadence returns to fifteen minutes when the sprint ends.
1.2.6 2026-08-21
Fixed
- The app now comes back after an update from any older version. The 1.2.5 fix for the vanishing app only worked when the machine was already on 1.2.5 — a computer that had been switched off through a few releases and then updated in one jump still lost its app until the next sign-in. The step that notices the app was open now travels inside the update itself, so it is always the current version doing the noticing, however old the installation being replaced. One consequence is honest rather than clever: on a jump from an old version the update cannot tell whether you asked for it, so the app returns to the notification area instead of guessing that a window is wanted.
1.2.5 2026-08-21
Fixed
- The app did not come back after updating itself. 1.2.3 added a step to put the app back once an update had finished, and on a real machine it never worked: the update runs as a background service, and a program started from there cannot reach the desktop you are signed in to. Nothing reported an error, so the app simply closed and stayed closed until you opened it again. The service now starts it in your own session, which is the one place it can actually appear.
- An update you asked for now brings the window back. If you press Check now and watch the app close, it reopens as a window, because you are sitting there waiting for it. An update that happens on its own in the background still returns quietly to the notification area instead of interrupting whatever is on screen — that part is unchanged, and it was never possible to tell the two apart before.
- Updates no longer leave the installer behind. Each one left roughly 5 MB of temporary files in the install folder, because the step that cleaned them up ran inside the process the update itself shuts down. They are cleared at startup now, including any left by earlier versions.
1.2.4 2026-08-21
Fixed
- Signing in threw a maximised window across the screen. The app is meant to start quietly in the notification area when Windows signs you in, and to open a window only when you ask for one — by clicking the tray icon, the Start menu entry or the desktop shortcut. The installer had been asking for the quiet start since 1.2.0 and the app had never listened, so every reboot put a full-screen window over whatever you had signed in to do. It now starts in the tray, and the window is one click away. Monitoring was never affected either way: the service measures whether or not the viewer is on screen.
1.2.3 2026-08-21
Added
- A warning before an automatic update restarts things. A notification appears about five seconds beforehand saying what is happening and that monitoring continues throughout. It comes from the app rather than the service, because a Windows service has no access to the desktop and cannot show anything — so the only thing that can give you notice is the app that is about to close.
Fixed
- The app did not come back after updating itself. A silent install deliberately does not open a window, so nobody is interrupted mid-task — but a self-update is a silent install that just closed a window somebody had open, and leaving it closed meant their app vanished until the next sign-in. It now returns to the notification area if it was running before, without raising a window over whatever you were doing.
1.2.2 2026-08-21
Fixed
- An automatic update stopped the app and the service and never brought them back. Windows runs a service inside a job object and child processes inherit it, so when the installer stopped the service — its own parent — the job closed and killed the installer part way through. The app was closed, the service was deregistered, and nothing restarted: the machine simply stopped measuring, with no error anywhere. The installer is now launched outside that job so it survives the service it replaces.
- 1.2.1 was withdrawn rather than left serving, so no further machine could reach it. A machine left in that state is repaired completely by running the installer once by hand.
1.2.1 2026-08-21
The agent is functionally identical to 1.2.0. This release exists to exercise the automatic update that 1.2.0 introduced: the only difference a running agent can observe is the version string it reports. If an update applies and the app comes back working, the mechanism works; if something breaks, it is the mechanism and not the payload.
Fixed
- A release could be published with no update signature, and nothing said so. That is how 1.2.0 was first registered: through the console, which has no signature field. Every agent correctly refused to apply it, so the release that introduced automatic updates could not be automatically applied — while the download page, the console and the fleet panel all looked healthy. Publishing unsigned is now refused unless it is explicitly asked for, which keeps download-only releases possible and stops the omission happening by accident.
- The internal check that every table the API queries actually exists could read ordinary prose as SQL, because of how it paired backticks. It reported an error message containing the words "update signature" as a missing database table. It had been wrong since it was written.
1.2.0 2026-08-21
Added
- The app updates itself. No prompt, no installer to run, no elevation after the first install. The agent checks every fifteen minutes as before, and now downloads, verifies and applies what it finds.
- Releases are signed, and an unsigned one is never applied. This is not a code-signing certificate and SmartScreen still warns on first install — it is a key pair we hold, whose public half is compiled into the agent and whose private half never touches the server. An attacker who took over the cloud tier completely could serve any update they liked and every agent would refuse it, because they could not sign it.
- Crash reports reach us. Both halves of the product have written crash reports to disk since 1.0 and nobody has ever read one, because they never left the machine. They now upload, tagged with the version that actually crashed — which is not always the version the machine last reported, since a build that cannot finish starting never gets to say anything.
- Start with Windows. The viewer returns to the notification area when you sign in. Monitoring already ran regardless; this is only the window. The service has always started at boot.
- The app opens by itself once installation finishes.
Changed
- Automatic updates were previously recorded as impossible without buying a code-signing certificate. That was wrong, and it had been written down as permanent. Two different problems had been given one name: SmartScreen needs a certificate authority, and telling our update from an attacker’s needs a key we control. Only the first costs money.
- A release that changes the install layout also applies by itself now. The service runs the verified installer silently, so the one remaining elevation prompt is gone. This is only safe because of the signature above — before it, the only thing vouching for those bytes was a TLS certificate.
Fixed
- A failed update leaves the previous version running. The replacement is downloaded and verified in full before anything is touched, both files are confirmed present before either is moved, and a swap that fails part way puts everything back. An agent that dies mid-update is worse than one that never updated: it stops measuring, and nobody finds out until they look.
1.1.3 2026-08-20
Added
- Path evidence now arrives without anyone pressing a button. MTR only ever ran on demand, so the whole trace subsystem — the hypertable, an ingest that refuses an unclassified hop, the shared shaper, the first-propagating-hop rule — was built and starved: four stored hops against thirty-five thousand measurement windows. The agent now traces one internet consensus target every hour, rotating, jittered from its per-install seed. One target rather than all four: tracing all of them hourly costs only 6.7% more probes but 66% again as much stored data as everything the product currently records, to trace three paths that share most of their hops. One rotating target is +1.7% on probes and +16% on rows.
- A trace at the moment the line breaks, which is the one moment path evidence cannot be collected afterwards — by the time somebody opens the workbench the path has usually healed. Rate-limited to one per ten minutes, on outage starts rather than outages, because a flapping line produces transitions continuously and a trace per transition would make the monitor part of the problem.
- A live ping in the workbench, alongside the running trace. It costs no extra packets: an MTR round already sends an ordinary echo to the destination, so at one round per second the ping was being sent all along and merely not shown. Running a second pinger beside the trace would have put two measurements of the same line in contention.
- A curated menu of targets worth tracing, in four groups, each entry saying why you would pick it. It sits beside the free-text field rather than replacing it.
- Path history, a third Troubleshooter tab listing the traces the agent collected on its own. Without it the automatic evidence accumulated somewhere the person whose connection it describes could not look. It answers a question the live workbench cannot: was it like this an hour ago? A trace run after noticing a problem describes the network at the moment you looked, which is usually after it recovered.
- Stop buttons on every trace, agent pack and diagnosis. A stopped trace keeps its rounds — twelve of forty is twelve rounds of evidence. A stopped diagnosis keeps nothing, deliberately: a verdict drawn from a truncated stage list cannot tell a check that never ran from one that found nothing wrong.
Changed
- Agent packs measure their hosts in parallel, cutting a five-host run from about three and a half minutes to about forty-five seconds. The hosts are phase-staggered across the round period rather than started together, and that stagger is load-bearing: every path out of the machine crosses the same gateway and ISP edge, so simultaneous starts would hand those shared hops five bursts at once, routers rate-limit ICMP, and the resulting false loss would land on the earliest hops — making the pack accuse your own ISP of a fault the measurement invented.
- Pack progress now counts completed hosts rather than started ones, so the bar no longer shows 20% before any work has been done, and every host’s hop table stays on screen instead of one shared panel flipping between them.
Fixed
- Opening the app again built a second copy of it. The window hides on close rather than exiting, so the process outlives its own window; with no single-instance guard, every launch from the Start menu started another app with its own tray icon and its own connection to the service, and nothing on screen said either was a duplicate. Reopening now shows the one already running.
- A failed hop lookup was retried on every round. Only successful ASN lookups were cached, which was survivable when one trace ran at a time and became a flood once packs traced five hosts at once — hundreds of DNS queries for a single unresolvable hop, sent from the machine whose connection was being measured. Failures are now remembered too, briefly.
- Hop lookups run concurrently rather than one after another, so a long path no longer delays the first round it is waiting on.
- The diagnosis report named bare addresses. Its path table never carried the operator, network or country, even though the renderer had columns ready for them — so the report a subscriber attaches to a ticket left the attribution to the reader, which is the step that decides whether a complaint reaches the right network.
- The agent pack view was dropping the same attribution for the same reason.
1.1.2 2026-08-20
Fixed
- The migration off the old install directory left it standing. 1.1.1 moved an existing install into
Program Files\\Helix Internet Monitor and deleted three files behind it, but not helix-desktop.exe — the app under the name Tauri emitted before 1.0. The directory removal is deliberately non-recursive, so one unnamed leftover keeps the whole folder, which is the thing the migration exists to prevent. The old Start Menu folder goes too; it was named for the vendor and held a shortcut into a directory that no longer exists.
- The uninstaller had the same gap and now removes that binary as well.
- Reinstalling after an uninstall could fail permanently. Neither half closed the desktop app. The service was always deregistered before its binary was replaced; the viewer never was. So an uninstall with the app open removed the shortcuts and registry keys, reported success, and silently left the executable -- NSIS
Delete does not report a locked file -- after which every reinstall aborted with "Can’t write: ...Helix Internet Monitor.exe". Both halves now close it first, and the uninstaller says so plainly if the file survives instead of finishing quietly.
Changed
- A running agent shows what it is doing. A pack run takes about a minute per host and previously showed the word "Running". It now streams the host it is on, the MTR round within that host, and the hop table filling in live — with the first hop whose loss carries downstream marked as it appears. Both progress bars are determinate because the wire carries both fractions. None of this is new measurement: it was already being sent and discarded.
- The Troubleshooter’s agents panel spans the page. It was being placed in the 260px history rail, which also displaced the diagnosis panel beside it.
1.1.1 2026-08-20
> Numbered on the 1.1 line rather than as 1.2.0, which the amount of new > capability here would otherwise call for. 1.1.0 is tagged, published and > serving downloads, so it cannot be re-cut — two different binaries behind > one version string would also defeat the update check added below, which > compares version strings and would never offer an agent on 1.1.0 a > different 1.1.0.
Added
- Troubleshooting agents. A curated pack is now something you run, not only something you subscribe to. A run sends an MTR to every host in the pack and reports where the path breaks rather than whether it is slow, naming only the first hop whose loss carries downstream — everything after it inherits that loss, so marking them all points at nobody. Runs keep no target, which is why every pack can be present and runnable on a fresh install: continuous measurement is limited to 16 probe slots and the five packs hold 18 hosts between them. Every run is coarse by construction, 40 probes against a floor of 300, and shows counts rather than a rate.
- The packs moved to Troubleshooter → Agents, which is where somebody with a stuttering game looks. They were in Settings, which was one of the three reasons nobody found them.
- The agent checks for its own updates, every fifteen minutes, jittered from the same per-install seed the probe scheduler uses so a fleet does not wake in unison. The check is performed by the Helix service rather than the app: the service already runs with the privileges an update needs, so there is no consent prompt to train anyone to click through. It reports what it finds and does not yet apply it — downloading and swapping binaries is gated on a signed installer.
- Version distribution across the fleet, for operators. Share is measured against agents seen in the last seven days, because a denominator including machines nobody has switched on since March never reaches 100% and makes a finished rollout look stalled. Counts only — no device or account is named.
- A speed-test dial leads the dashboard, with latency, jitter, loss, MOS and score beside it. It was previously one of four reorderable panels and sorted last in the default mode.
Changed
- The live throughput chart is 320px rather than 150. Mirrored, the old height gave each direction about 65 usable pixels, at which bufferbloat, a sawtooth under congestion and a clean saturated transfer look identical.
- The taskbar icon is the white artwork. The Windows taskbar is dark by default and does not read the app’s theme, so the deep-navy tile sat nearly flush against it.
- The IPC protocol is version 2. Additive only, and the service accepts both 2 and 1, so an app and a service from adjacent releases interoperate during an update window.
Fixed
- The installer could never move an existing install into the branded directory. The default was corrected in 1.1 and every machine that had the old
Program FilesHelix layout inherited it forever, because the installer reads the recorded path and reuses it. A legacy path is now migrated; any other recorded path is still honoured.
- Right-clicking the tray icon opened the window instead of the menu. The click handler matched every mouse button, so the window took focus and dismissed the menu Windows was showing on the same gesture. The menu had been correct and unreachable since it was written.
- The tray icon is kept out of the Windows 11 overflow flyout, which matters more than it sounds: promotion is recorded per executable path, so the directory migration above would otherwise have silently un-pinned it.
- A test-harness reset trusted
TRUNCATE ... CASCADE for two tables that have no foreign key, so rows leaked between database-backed tests.
1.1.0 2026-08-20
Added
- Per-hop MTR reaches the cloud. Each hop carries its loss classification as part of the row rather than as a rendering decision: whether a hop’s loss persists downstream is a property of the whole trace, so a reader holding one row cannot recompute it. A hop arriving unclassified is refused at ingest, because the only thing left to render would be a bare percentage - the reading that gets an innocent transit provider blamed. Only the first propagating hop is marked as the culprit; everything downstream inherits the loss.
- Diurnal profile - a 7x24 weekday-hour grid. Cells recombine from counts, never from averaged rates, so a 12-probe window does not weigh as much as a 600-probe one, and bucketing happens in the subscriber’s local zone, because a fixed offset is wrong twice a year in every DST zone and moves the evening peak into the wrong column. The worst hour is a ratio against the line’s own median and is left unnamed below a coverage floor.
- Per-application usage on Windows, collected via ETW.
- Target packs - mode-specific host sets selected by id. The list is compiled in and the type deliberately does not implement
Deserialize, because constructing one from bytes is exactly the ability to name a host from outside the binary. Pack targets never join outage consensus, so a Discord outage is not reported as the subscriber’s line going down.
- On-site CDN and IP-transit checks, with HTTPS health checks alongside ICMP and MTR. One catalogue entry records that
www.netflix.com blocks ICMP by policy, so its ping failure is not read as a fault.
- DoH resolver catalogue with filtering levels and a lowest-latency pick.
- User-defined watched hosts, labelled, visible on the desktop and in the cloud.
- Tiered providers and ticketing - bilateral
provider_links invited by the customer and accepted by the provider, escalation as a forward rather than a move, attach-time redaction against an allowlist, and an SLA clock that runs in business hours.
- Crash reporting for the desktop app. Reports stay on the machine.
- The app now opens maximised.
POST /v1/admin/releases/fetch registers a release by downloading it from its published URL and measuring it, rather than hashing a copy placed on the server by hand. Cutting a release no longer needs shell access to production. The digest still describes bytes the server received rather than a claim the caller made, which is the property that matters while the installer is unsigned.
Changed
- Dark is unconditional; light is an explicit opt-out. There is no
prefers-color-scheme: light block anywhere, so a visitor whose OS prefers light still gets the intended theme. The theme control lost its third "auto" state in the same change, because with the media query gone "auto" and "dark" selected identical pixels.
- The chart palette is six series, not eight. The shipped values were measured against a CVD simulation rather than read: two of them sat adjacent at roughly half the required separation under deuteranopia - indistinguishable to about one man in twelve, and the exact defect the code comment claimed the ordering prevented. No seven-hue set clears all-pairs separation inside the required lightness band, so both palettes are now generated rather than chosen. A seventh series folds into an "Other" bucket or a second encoding channel.
- Installs to
C:\Program Files\Helix Internet Monitor, with a branded installer.
- Gauges are determinate only when the wire carries a real fraction. The loss gauge refuses to draw an arc below 300 probes and shows counts instead; latency is graded against the line’s own baseline, never an absolute scale.
- Release downloads are served from GitHub. The counted, rate-limited
/v1/downloads/him URL is unchanged - only what it redirects to moved.
Fixed
- A cross-organisation ticket could leak an internal article. The read predicate compared author and reader organisation without a non-null guard, and JavaScript’s
null === null is true where SQL’s NULL = NULL is not, so the two halves of the check disagreed. Unreachable in practice only because subscribers cannot author internal articles.
- Loopback traffic was counted as internet usage by the ETW collector.
- Recovery notices were swallowed by the packet-loss cooldown, so a line coming back could go unannounced.
- Hop tables are never cropped. A
58vh cap on the desktop hid exactly the row nearest the fault.
- The sign-in pages now say which password they want.
- Every
/v1/admin route in the download area was unreachable. They call requireSuperAdmin(), which reads a principal that only the requireUser preHandler sets, and none of them registered it -- so release registration and the whole download console answered 401 to a valid super-admin token, looking exactly like a bad one. No behavioural test could have caught it: an anonymous request gets 401 either way, so the wiring is now pinned structurally and a missing principal raises a named error instead of impersonating an authentication failure.
- The published release body began with a byte order mark, and its unsigned-installer warning was absorbed into the table above it by markdown, so the one paragraph that has to be seen rendered as a table row.
Security
- The subscriber sign-in identifier uses
autocomplete="username", which is what makes a password manager offer the saved Helix password rather than leaving the user to type a remembered - and often reused - one.
- Release redirect targets are validated against a compiled-in host allowlist, on write and again on read.
/v1/downloads/him is public and unauthenticated and it hands out executables, so a free-text target would be an open redirect wearing the product’s own domain.
Known limitations
- The installer is not code-signed. SmartScreen will show "Windows protected your PC" and Chrome will warn on download. Signing is blocked on a certificate whose key must live on FIPS 140-2 Level 2 hardware, a CA/Browser Forum requirement since June 2023. The published SHA-256 is the honest mitigation until then.
Method::SetTargets is refused by the service pending an elevated confirmation flow.
1.0.0 2026-08-18
First public release: the measurement service, the desktop viewer, the cloud API and the four-tenant ISP model.
- Latency, packet loss and outage detection, with counts and run lengths on the wire rather than percentages, because a percentage cannot be re-aggregated. Loss below 300 probes is flagged coarse rather than quoted as a rate.
- A diagnosis engine whose verdicts carry
contradicting[] as well as supporting[]; one that cannot populate the second is not shipped.
- Consent, scope and article-visibility as three separate gates, each in one module, so a widening shows up in a diff.
- Maintenance windows suppress fault attribution only when declared at least fifteen minutes before the fault, or the feature inverts into a retroactive amnesty.
- Desktop app talking to the service over a named pipe on a versioned wire.