Novus Stream Solutions

Changelog

Ecosystem changelog

High-level updates for the novusstreamsolutions.com hub and related products. For product-specific release notes, follow each spoke site as it publishes its own announcements.

Retired Novus Examples and Novus Striker, and wrote down how the apps come back

  • Retired Novus Examples and Novus Striker. Sonic Weaver is now the one product on this site. Their documentation, tool maps, tutorials, product and topic pages and the posts about them redirect to the closest page that still exists.
  • Added a retired apps page that lists all eight apps retired this month and how we plan to bring them back: as part of this site, either as downloadable programs or as smaller, tailored experiences built into it. There are no dates yet; each return will be announced here first.
  • The old addresses of all eight apps lead back here: their front doors and product pages to that page (the six apps retired on September 25 used to lead to the portfolio), and their blog, help and policy pages to the matching page on this site.

Retired six apps: their addresses now redirect here

  • Retired six apps: NSS Background Remover, Novus PDF Studio, Novus Convert, Novus Learn, Novus AI Stats and Novus Restaurant. Their pages on this site, including documentation, tool maps, tutorials, product and topic pages and the articles that were only about one of them, now redirect to the closest page that is still here, never to the homepage.
  • Their own addresses redirect here too, once each domain is moved onto this site: a product page goes to the portfolio, a help page to the help centre, a blog post to the product blog, and the sitemap, llms.txt and feeds to this site's own.
  • The portfolio is now Sonic Weaver (formerly Novus Visualizers, now at sonicweaver.com), Novus Examples and Novus Striker. Every list, menu, card, feed, sitemap and machine-readable directory on this site reads the new roster from one place, so none of them can still name a retired app.
  • The cross-product workflows page retired with them: every one of its eight recipes needed at least one of the six apps.

Made "Skip to main content" reachable again for keyboard visitors

  • Every page on this site starts with a "Skip to main content" link, so somebody navigating by keyboard can jump past the header instead of tabbing through the whole menu. On every page, in every browser, the first Tab was going somewhere else: past the skip link, past the menu button, and onto the site name. The link was in the page and styled correctly, and it still could not be reached.
  • The cause was the site menu returning focus to its own button. That behaviour is right when you close the menu, and it was running when the page loaded as well, before anyone had opened anything. The browser then treated the next Tab as continuing from the menu button rather than starting at the top of the page. It left no trace afterwards, which is why it survived: inspecting the loaded page showed nothing focused and nothing out of place.
  • The menu now returns focus only after it has actually been opened. Closing it with Escape or the close button still hands focus back where it belongs, which the keyboard tests for the desktop drawer and the phone sheet confirm.
  • This was a WCAG 2.2 "Bypass Blocks" failure on all 606 pages. The browser tests that cover the skip link were failing on all four engines and are now passing; the fix was proved by watching them fail before it and pass after.

Fixed the product roster this site was publishing in prose, and made it impossible to retype

  • Novus Restaurant has been live for weeks, and this site kept telling people about eight products while listing seven. The share-card renderer behind every link preview drew a checklist headed "Eight free apps" and the eight names on it included Novus Striker, which is in early development, and did not include Novus Restaurant. The footer that renders on every page named seven live apps. The FAQ said "The current live products are" and named seven, both in the answer a reader sees and in the structured data Google reads from the same page.
  • Two pages contradicted themselves on one screen. The Dev Studio page opened with "Seven live apps," directly above a list of eight, and eleven lines above a card reading "Eight free apps you can use right now". The Ventures page promised "six free apps" in its search snippet and named six of the eight. The snippets for About, Tool maps, Product blog, Terms and Tutorials each named a different subset of the roster.
  • None of this was a typo repeated nine times. The roster has had one source of truth since July 2026 and the app COUNT has been derived from it just as long, so every grid, nav and sitemap on the site was already correct. What was never derived was the roster written as a sentence, and a sentence is what search engines quote, what a link preview shows, and what the footer puts under every article.
  • Every one of those sentences now reads the roster out of the catalog, including the share-card renderer, the footer, the three FAQ answers that list the products and their structured-data mirrors, and seven page descriptions. Ship a product and its name appears in all of them; retire one and it leaves. The site-wide keyword set was five of the nine products and is now all nine, and the documentation index was missing Novus Restaurant from its own.
  • The homepage block that answers "show me how to use these" had a card for every product except Novus Restaurant, whose tutorials are in the sitemap, in the menu and in the closing button row. It has one now, pointing at the two published Novus Restaurant walkthroughs.
  • Three checks hold all of it. The first reads the description each page actually publishes rather than the file it is written in, and fails when any sentence, any list of app names, the homepage tutorial cards or the share-card artwork generator presents the roster with a product missing. The second adds a product to the catalog and confirms every roster sentence grows, because a hand-typed list that happens to be right today passes every other check and only goes wrong on the day the next product ships. The third renders each variant of the share-card endpoint and checks the response is the real card, because that endpoint answers a broken card with a plain wordmark rather than an error, so a failure there would have been visible only as a bad link preview on somebody else's timeline.
  • Seven deliberate breakages were made to prove those checks, and all seven were caught: a hand-typed roster in a page description, a missing homepage tutorial card, a deleted tile in the artwork generator, the old hand-typed list of names in the share-card renderer, an early-access product counted as live, a correct-for-today copy of the roster pasted over the derivation, and the one-line change that makes the share-card renderer fall back to a wordmark. The last two passed the first version of the checks, which is why there are three.

Corrected a language claim this hub was making on Novus Learn’s behalf

  • Four places on this site told visitors that Novus Learn “ships in ten languages” and listed them: English, Français, Español, Deutsch, Português, Italiano, 日本語, 中文, العربية and हिन्दी. Novus Learn has no translated interface at all. It declares itself an English page, carries no translation library, no phrase files, and not one component that reads a translation.
  • The ten names had been copied from Learn’s Wikipedia SOURCE picker, whose own label reads “Wikipedia language”. That is a real and useful feature — you can pull an article from any of ten Wikipedia editions and have it summarised, turned into notes and quizzed in the language it was written in, because everything is extracted from the source’s own sentences — but it is not a translated interface, and the two are not the same promise.
  • All four now describe the actual capability and say plainly that the interface is English. The underlying figure was renamed from “interface languages” to “Wikipedia language editions” so the old sentence cannot be reassembled from it by accident. Learn’s own pages were always accurate; only this hub was wrong about it.

A browser checked every page the way a person would, and fixed what it found

  • Drove all 43 hub routes at desktop and phone width, 86 page views in total, measuring what a visitor actually experiences: text contrast against the pixels behind it, whether a control is big enough to hit, whether headings step in order, and whether anything hidden can still be reached with the Tab key. Warnings fell from 1,318 to 236 and there are no errors.
  • Most of it was one mistake repeated everywhere. The light theme inverts the neutral palette so dark-first components keep working, which maps slate-600 to a pale grey that is a good border colour and a 2.45:1 text colour. In dark mode the real scale gives 2.66:1. There is no background on this site where it passes, and 754 of the 1,095 contrast findings were that single class. All 37 text usages moved to the muted-text class already used 189 times elsewhere, which measures 7.24:1 light and 7.87:1 dark.
  • Two accents were failing as text on light surfaces and were darkened there only: the link colour used for "Cookies and analytics" on every page went from 3.91:1 to 5.67:1, and the green carrying the small "included" markers and LIVE status badges went from 3.60:1 to 5.24:1. A status badge nobody can read is a badge that does not work. Dark mode already passed and is untouched.
  • The footer’s column headings were h4 with no h1, h2 or h3 above them anywhere in the footer, so a screen-reader user navigating by heading heard them as sub-sub-sections of something that does not exist. Every page reported the jump. They are h2 now, and heading-order findings fell from 76 to 20.
  • Four standalone links sat under the WCAG 2.2 minimum target size of 24 by 24 CSS pixels, including "Cookie preferences", which is the route to the cookie settings and therefore the control someone reaches for at precisely the moment they want to change their mind.
  • Corrected the checker itself where it was crying wolf, because each false alarm was hiding a real fix behind noise: a subtree marked inert is not a focus trap, React’s development-only console notice is not a site defect, and screen-reader-only text is not something a sighted visitor can fail to read. The same three fixes went to all ten sites so their reports mean the same thing.

Novus Restaurant joins the portfolio as the ninth app, and eight stale product figures were corrected

  • Added Novus Restaurant to the hub: documentation, a tool map, two tutorials, a launch post, nav and footer entries, an animated product demo, and bespoke share artwork. It reads food-price series published by eleven official statistical providers — USDA My Market News, AAFC Canada, DEFRA, FAOSTAT, FAO FPMA, EU Agri-food, World Bank RTFP, SNIIM Mexico, MAFF Japan, ABS Australia and Stats NZ — across nine markets.
  • Documented it honestly as the one app in the portfolio that is not browser-first. Its public data explorer needs no account, but the operator workspace does, because aggregating data other institutions publish on their own schedules requires server-side ingestion rather than local processing. The hub says so rather than copying the "your files never leave your device" promise that is true of the other eight.
  • Deliberately quoted no observation or series totals for it anywhere on the hub: ten scheduled jobs re-ingest that table every morning, so any figure written into hub copy would be wrong within a day. Only registry-backed counts (providers, markets, coverage tiers) are mirrored.
  • Corrected eight product figures that had drifted since the 2026-08-09 pass. Novus Convert: 2,341 → 2,400 working conversion routes, 244 → 255 browser-ready inputs, 2,338 → 2,397 indexable pairs. Novus Examples: 4,075 → 5,075 fixtures, 24 → 27 categories, 267 → 288 extensions, 123 → 131 curated purposes, and 401 → 402 video files. The Examples figures were measured by executing its 27 category manifests rather than reading its README, which still described the shipped P8 wave as unreleased.
  • Regenerated all share cards. Sixteen of the twenty-seven had been stamping "Nine browser apps" and four still drew a tile for the retired Novus Odds product — the generator had been corrected weeks earlier but never re-run, so crawlers kept receiving the stale PNGs. Card copy now derives its app count from the roster instead of repeating it, and the tile grid sizes its contents from the computed row height so a growing roster cannot push text through a tile border.
  • Removed two phantom figures from hand-authored artwork: "111 families / 4,520+ presets" on the visualizers docs and tutorial heroes (pre-V3 counts the product repo confirms no longer exist), and "90+ tools" on the BG Remover docs hero, where the executed tool catalog holds 40.

Homepage compressed to three featured stories plus an ecosystem explorer, and every product demo got controls

  • Replaced eight stacked product narratives with three fully expanded chapters and a selectable ecosystem explorer holding the remaining five, addressing the audit finding that the homepage had become a catalogue rather than a guided product story.
  • All five explorer narratives are rendered into the server HTML rather than mounted on click, so search engines and AI crawlers read the complete ecosystem story without running JavaScript; the inactive panels are hidden, and because the demo loops are gated on viewport intersection, a hidden panel runs no animation timers at all.
  • The explorer is a standard tabs widget: arrow, Home and End keys move between products, the tab list is a single stop in the tab order, and each panel is reachable by keyboard.
  • Gave all eight product demos Pause/Play and Replay controls — previously they were infinite loops with no user control at all. Pausing genuinely stops the animation rather than only relabelling the button, and each control is named for its product so eight demos on one page do not share one accessible name.
  • prefers-reduced-motion still freezes every demo on its finished frame by default; the Play button now lets a visitor opt a single card into motion, which is a user-initiated action rather than an override of the preference.
  • The demo cards are no longer hidden from assistive technology wholesale — the decorative pixels remain hidden, while the step status line and the new controls are exposed.
  • The eight chapter narratives moved into one registry (app/lib/homeChapters.ts) derived from the app catalog, so the featured/explorer split is a slice index rather than a second copy of the copy, and chapter numbering can no longer disagree with catalog order.

One canonical home per article, and a licence

  • Added the W16 canonical mechanism: an article can now declare that its canonical copy lives on a product domain, which drives the canonical link, the og:url, the schema.org url, and a visible “Originally published on …” credit together, so the signals cannot disagree.
  • Measured the duplication the rule exists to prevent before changing anything: across the hub’s 344 posts and all seven product blogs (226 posts between them), there is exactly one shared slug and no shared titles. That one collision is two different articles on the same topic rather than one article published twice, so no canonical was re-pointed and every hub post stays self-canonical.
  • The build now rejects a canonical that is relative, insecure, aimed off the ecosystem, aimed back at the hub, or aimed at the wrong product — the last being the mistake most easily made by hand and least likely to be noticed.
  • Added a LICENSE file: the applications stay free to use with no paywall or signup, funded by advertising, while the source remains private and all rights reserved.
  • Fixed the ecosystem counter strip, which was still repainting a literal 0 over the correct server-rendered figures on first view. The previous pass documented the fix in a comment but left the code easing from zero.

Two August 1 field guides, plus a reviewed-and-updated pass over the blog

  • Published “When your docs drift from your product”, a method for auditing documentation against what the code actually ships, and “Career aptitude tests: what they can and cannot tell you”, the first article to cover the careers and assessments half of Novus Learn — 565 occupation profiles across 20 families, 376 aptitude practice suites, 2,200 authored cognitive questions, 200 puzzles, and the 12-module, 77-lesson JavaScript course.
  • Both were built to the full house format with excerpts, snippets, card highlights, SEO metadata, four-item FAQs, related posts, internal and external links, and a mid-article figure; each clears the 2,500-word gate.
  • Added new PNG hero, inline, and byte-identical OG twin images for both posts through the composite pipeline used since July 26, and advanced the sitewide share-image cache version to 20260801a.
  • Added a reviewedAt / reviewNote mechanism to the blog: refreshed posts now show a dated “Reviewed and updated” notice naming what changed, and report a real dateModified to search engines instead of repeating their publication date.
  • Corrected stale product claims across 23 existing posts and the tutorials: Novus Visualizers is ten engines and sixty modes rather than nine and fifty-four (the Logo engine and its six modes were added throughout, including a new section in the engine field guide), Novus Convert is 1,636 working routes across 209 browser-ready inputs rather than 1,022, Novus Examples is 2,558 files and 504 visual templates rather than 2,428 and 480, and Novus AI Stats supports seven import sources including Cursor with the “private beta / owner account” framing removed.
  • The two new posts landed in Stack & engineering (a new “Docs & content systems” sub-category) and Novus Learn (a new “Careers & assessments” sub-category); the homepage carousel, blog landing, category hubs, search index, static routes, BlogPosting and FAQPage schema, and sitemap all update from the shared registry.

Deep-dive posts and tutorials: Product blog. Technical documentation: Documentation.