OctoMonic
2026-08-22

octomonic.com · 2 August to 22 August 2026

What has actually been done

Twenty three days, twenty three shipped rounds across two repositories. This page is the record: what went live, what was broken and got fixed, what measurably improved, and what is still waiting on a decision.

Written from the commit history and the session log, not from memory. Nothing here is sanitised.

State of the site today

Where octomonic.com stands as of 22 August 2026.

Live
  • 28 prerendered pages, real URLs in both languages under /en/ and /he/
  • One call to action site wide: the free 5 to 10 minute conversation
  • Booking runs on a Python service on the Elestio VM, off n8n since this morning
  • 10 product demos wired to their portfolio cards with real screenshots
  • An email gated sample viability assessment for visitors who will not book
  • A cost guide and three case study pages built for search
Works
  • Booking end to end: form, live slots, instant confirmation, Google Calendar event, Meet link, confirmation email to the lead and to Tom, WhatsApp ping, calendar file download
  • Cancel and reschedule, with nine alternative slots offered by email
  • Accessibility 100, SEO 100, best practices 100 in both languages
  • Mobile performance 100 on every route except the booking page
  • Hebrew and English at full parity, 633 translation leaves each
Does not work yet
  • No card payments. Grow verification has not cleared, so the site has no checkout page at all
  • No analytics. The GA4 measurement ID is missing and the Meta and TikTok pixels are scaffolded with empty IDs. Any ad campaign launched today would run blind
  • No human on the site. The portrait and LinkedIn slots are built and render nothing while empty
  • No booking acknowledgment email. The template is written, nothing is wired to send it
  • Professional Training still has no retail price

Measurably better

The numbers

Every figure below was measured before and after, in a real browser or a real test run.

60 → 100
Mobile Lighthouse performance, English home page
93 → 100
Desktop Lighthouse performance
7.8s → 1.3s
Largest contentful paint on mobile
95 → 100
Accessibility, both languages
0
axe-core violations across 56 route, locale and width combinations
54%
Booking page copy cut
20,178 → 8,243px
Height of /work on a phone, down 59% in English and 56% in Hebrew
311 → 0
Interactive elements under 44px, from the booking page alone to zero site wide
727 → 201KB
Main JavaScript bundle, plus per route chunks
314 → 46KB
Favicon payload
20 → 28
Prerendered pages, including 8 new URLs built for search
0 → 19
Hebrew search query terms present in copy, across four phrases
14.36:1
Accent contrast on black, 90 colour pairs checked, zero failures
94 → 7
First person hits in English copy. The seven survivors are the visitor's own outgoing WhatsApp message
7 → 0
Uses of the phrase "by hand"
412
Tests on the new funnel service, mutation tested
8 → 0
n8n workflows in the booking path. Replaced, with a two second rollback
~2.4k
Fabricated "automation hours" deleted from the homepage counter

Not done

What is still open

Three of these are blocked on Tom and nothing moves until they clear.

Blocked on Tom · 01

Grow verification (Green Invoice)

Until it clears there are no card payments anywhere on the site. The ₪250 consultation, the viability assessment and the workspace setup day all have prices on the page and no way to pay them. The legal pack was written and reviewed on 20 August and still cannot ship, because the fix specification named a checkout screen as its target and octomonic.com has no payment page at all. That was a mistake in the spec, not in the legal work.

Blocked on Tom · 02

The Meta chain

Analytics and advertising are blind. The GA4 measurement ID is missing, the Meta and TikTok pixels are in the code with empty IDs, and the Meta integration built on 9 August is idle because no Meta assets exist yet.

The creation order is forced by Meta and cannot be reordered or skipped: Page portfolio ad account (currency ILS, and it cannot be changed later) link Instagram system user token. Page and Instagram creation have no API at any tier, so this part is manual by definition.

Blocked on Tom · 03

LinkedIn URL, plus a portrait

Two constants in one file. This was the audit's single strongest signal: four of seven independent review lenses said the same thing without conferring, that a site selling one specific person shows no human being anywhere on it.

The LinkedIn URL is the non negotiable half, because it is what lets a stranger verify the person exists outside this website. It ships alone if Tom would rather not have a photo. Both slots are wired and render nothing at all while empty, so there is no risk in leaving them until he decides.

Also outstanding
  • Booking acknowledgment email. The template is written and sitting at the foot of the copy file. No consumer is wired to it, so nothing can send until Tom approves the wording.
  • Professional Training has no retail price. The JobHub figures are a partner split, not a retail rate, so quoting them would be wrong.
  • Workspace tier undecided. Google Business Starter cannot record Meet calls, so the recording consent copy is deliberately unshipped rather than shipped as a promise that cannot be kept.
  • The booking page will never score 100 on mobile performance. It is the one route that cannot be prerendered, because it needs live slot data at load. That is a deliberate trade, not an outstanding bug.
  • Hebrew mobile Lighthouse reads around 79 locally under machine load, while real browser first paint measures 296 to 436 milliseconds. Needs a clean re-check through PageSpeed Insights when the keyless quota resets.
  • The WhatsApp floating button clips the closing call to action arrow at some mobile scroll positions. Cosmetic, still tappable, still open.
  • Lead Capture was deliberately not ported off n8n. Blueprint was retired in July, the path appears nowhere in the site source and the workflow has zero executions. Porting dead code would have been waste.
  • Six files in the site repository are modified and uncommitted right now (the work data, the case study page, the cost page, the work page and the SEO strings). That is live in progress work, not a finished round.

The record

Day by day

Newest first. The honest version.

22 Aug Off n8n, eight new pages, and the animation Tom killed

Five shipped rounds. The largest single day of the month.

What shipped

The booking funnel moved off n8n onto its own service.

Nineteen modules, roughly 5,100 lines, 412 tests. It handles availability, booking, confirmation, cancellation, rescheduling and the contact form. GoMobile, GPI, Registration, Wolt and the shift and transaction services stay on n8n, untouched, and were verified still serving after the switch. Rolling back takes about two seconds and all eight old workflows were left active in case it is needed.

Eight new pages aimed at search.

A cost guide at /what-it-costs and three problem shaped case pages, in both languages. The highest intent question in this market is some version of "how much does it cost to build this", and almost nobody answers it honestly, which is exactly why it can rank. Only defensible figures are used. No client is named on any of them. They are deliberately not in the navigation, because they are search landing pages rather than funnel steps.

Anyone outside Israel now always lands on English.

Including incognito. Firebase Hosting has no edge compute and the domain is not behind Cloudflare, so the visitor's IP country simply is not available. Device time zone is free, instant, offline and close enough. An unreadable time zone is treated as "not Israel", so the failure mode is English, which is the requested outcome anyway.

A native English reading pass over every visible string.

Including the states nobody reads: validation errors, the outage fallback, both success screens, the escape hatch, the 404 and the five email templates. Around 70 English and 17 Hebrew strings changed.

The brand mark now moves.

Four behaviours on the emblem itself: it tilts and lifts on hover, it becomes the loading spinner while a booking step is open so the page has one loading idiom and it is the brand, it pops as the confirmation seal, and it drifts almost subliminally at rest. All four stop dead under reduced motion with the mark left in place.

Polish tier finished.

Form inputs raised to 16px across 22 controls site wide, because 14px was triggering an iOS zoom on every single field. A missing mobile preview crop on the home page fixed, where a desktop crop was rendering an illegible sliver. Arrow travel added to the two call to action components.

What broke and was fixed

Bookings were being silently rejected for nine days.

The site's form contract is name, plus phone or email. The n8n validation node required all three. A lead who filled in a name and an email and no phone number was rejected at the confirm button, and nobody saw it, because the rejection happened server side after the visitor had already done the work.

This had been live since 13 August. It is the reason the whole service exists. The validation rule now lives in exactly one place, frozen as data, with a test that reads the site's own form component and fails the build if the two ever drift apart again.

The new service connected to the wrong database, and the health check said it was fine.

The shared environment file on the VM is used by every AIOS service on that machine, and it already carried a DATABASE_URL for a different project pointing at a remote Neon database. That generic name sat first in the lookup order, so the funnel service connected to the wrong database as the wrong user.

The dangerous part was the health check. It reported db: true, because a database answered. Only an actual query failed. Flipping live traffic onto that green tick would have taken the booking page dark. Caught before cutover. Generic environment names are now banned from database resolution outright.

A daylight saving bug that would have fired in October and been invisible until then.

The test suite was mutation tested: five deliberate regressions injected to see whether the tests would notice. Four were caught. The fifth, hardcoding UTC+3 instead of the Asia/Jerusalem time zone, survived all 314 tests, because in August Israel daylight time is UTC+3.

Israel returns to winter time on 25 October, and the discovery call offers slots ten working days ahead. So from the middle of October it would have started writing wrong instants into the database, wrong times into every confirmation email and wrong times into every calendar invite, silently, with nothing failing. Fourteen daylight saving tests were added and the same mutation now fails six of them.

The WhatsApp ping to Tom failed on the very first live booking after the switch.

Both emails sent correctly. The WhatsApp notification died on a name resolution error. The Evolution API address in the shared environment is a Docker internal host name, which is correct for n8n because n8n is a container, and unreachable from the new service because it runs as a host process. Fixed with a service specific override, leaving the shared value alone so the containers keep working.

The homepage said "by hand" seven times, because the style guide told the agents to write it.

Tom caught it on the live site and asked whether a full English quality pass had ever been run. It had not. Every previous round checked structure, English and Hebrew parity, accessibility, link health, console errors and word counts. Nobody had ever simply read the English as an English reader, and the agents that wrote the copy were the same ones grading it.

It got worse before it got better. The first sweep only touched one file and reported "seven down to zero" while four instances survived elsewhere, including one on step 1 of the booking page in the default path. That is a false all clear, which is worse than no check. The rule in the file header that instructed agents to use the phrase was also corrected, which is the actual reason it kept coming back.

Other things that pass a structural check and fail a reading: "points at" instead of "points to" three times, one of them a heading. A 21 word gap between subject and verb in the viability lede. "On your machines", which quietly contradicts the one person scope that the price depends on. Retired call names still sitting in every confirmation email.

The character animation was rejected six times and then removed.

The booking page had been rebuilt on 13 August around two animated characters traced out of the emblem. A critic reviewed a well known reference loader, measured that it separates its parts across ten distinct hues, and prescribed the same treatment here. That was an accurate reading of the reference and the wrong prescription for this brand, and it was applied literally instead of being questioned.

"The octopus is purple and weird, the other one looks like a Cyanide and Happiness character, both look ridiculous."

He was right. The emblem is a stark black on yellow noir mark, and a purple mantle, teal sleeves, an orange belt and auburn hair destroyed the one thing that made it good. The colour experiment was reverted. Separation now comes from value and from white, not from hue, which is how the reference actually reads too.

After the sixth rejection Tom said to remove the animation and let the logo do the work instead. The two character scene is gone from the booking page: the stage unmounted, the state machine deleted, about 170 lines of CSS removed. Animating the mark as a whole keeps what made it good. The rigged source files are preserved in case an animator is ever hired.

Two useful things survived the revert, because they were right regardless: the characters had been display:none below 1024px, meaning nobody on a phone had ever seen them, and the opacity range was too flat to read.

20 Aug The legal pack that cannot ship

What shipped

A publishable terms and privacy pack, Hebrew and English, grounded in statute.

Two research lanes plus an accountant lane, then a draft, then two independent adversarial reviews that both rejected version one with 37 findings between them, then a fix pass, then an independent certifier. 34 of the 37 findings closed. Six of the nine Grow compliance items now pass on the document text alone.

VAT decisions implemented.

VAT absorbed rather than added, no consumer facing price raised. ₪250 stays ₪250 and is now VAT inclusive, netting ₪211.86.

What broke and was fixed

Version one cited a law section that does not exist.

An invented citation, an unverifiable one, two broken internal cross references, and false factual claims about data processing agreements that were never actually executed. All removed. This is exactly what the two adversarial review passes were for.

The whole pack is still unshippable, and the reason is a specification error.

The original fix specification named the post booking landing screen as the checkout target. It is not a checkout. octomonic.com has no payment page at all. The legal text is finished and correct and cannot go live until there is something for it to attach to, which loops back to Grow verification.

13 Aug The booking page becomes a showpiece, and starts telling the truth

What shipped

Instant confirmation.

Bookings inside pre approved windows now confirm immediately with no approval wait. Tom keeps cancel and reschedule and the copy says so plainly, both at the confirm step and on the success screen. Slots outside the window still take the request path.

The booking page rebuilt as a three step flow.

A progress stepper driven by work actually done rather than by which screen you are on, slot skeletons while data loads, submit progress wired to real API milestones rather than a fake timer, a calendar file download, and the whole thing completable by keyboard.

Move and cancel, with a nine slot reschedule.

Moving a call now emails the lead nine options, three from each of the next three days with availability. Rendering happens on a GET and committing on a POST, so a mail client prefetching the link cannot accidentally rebook someone.

Brand characters extracted as a reusable asset.

Traced out of the emblem: site grade and detail grade versions, flat and rigged with per joint pivots, a reproducible extraction script and a self contained posing tool. Later removed from the site (see 22 August) but kept as an asset.

What broke and was fixed

The site was telling leads their call was confirmed when it was not.

The success screen read "Confirmed. The time is taken and the calendar is updated." Behind it, the backend only wrote a 24 hour hold and emailed Tom approve and decline links. No calendar event was ever created. If Tom declined, the lead was told nothing at all.

Fixed structurally: the calendar event is now created inside the request, and the response carries an explicit confirmed or pending status, so the front end physically cannot claim a confirmation it did not receive. If the calendar call fails it degrades to a real hold with honest copy.

Two people clicking the same slot got a server error.

Slot claiming is now atomic, with a database level exclusion constraint over the time range. The losing request gets a clean "slot taken" response and an availability refresh instead of a 500.

Declining a booking told the lead nothing.

Decline is now routed into cancel, which actually emails the lead. Both old webhook paths were kept alive so approve and decline links already sitting in Tom's inbox still answer.

Honest caveat recorded the same day.

The booking page mobile Lighthouse score was never 100 and was not claimed to be. It is the one route that cannot be prerendered because it needs live slot data. The animation cost 2.3KB gzipped on every page and 18KB on the booking page.

12 Aug Every shared link was unfurling as a grey box

What shipped

A LinkedIn profile and content plan, with the API reality verified live.

Publishing text, images and PDF carousels to a personal profile is possible with a self serve app and no review. Company page posting needs vetting. Direct messages, connections and search are partner only and unreachable for a one person consultancy. Third party automation carries a genuine ban risk.

What broke and was fixed

The sample viability assessment and all ten demos shipped with zero Open Graph tags.

Every one of those links, pasted into LinkedIn, WhatsApp or Slack, unfurled as a bare grey card with no image, no title and no description. These are precisely the assets most meant to be shared: the payload of the email gate, the links dropped into founder groups, the featured items on a LinkedIn profile. Found by accident while writing the LinkedIn plan.

Tags added. Each demo now uses its own preview image; the sample uses the brand card.

The sample spec was linking to a redirect instead of its own real URL.

Clean URLs turn the .html form into a 301, so every visitor to that link took an extra hop for no reason. Repointed at the canonical address.

A briefing omission, recorded rather than buried.

The recommended LinkedIn headline led with the restaurant background, which Tom had explicitly killed for the website on 5 August. That was a briefing failure on the AIOS side. Both variants were shipped side by side in the document rather than quietly picking one.

9 Aug A 47 recommendation audit, audited and built in the same day

What shipped

A seven lens audit of the live site, then the build round for it.

84 raw findings synthesised down to 47. The four strongest signals, each found independently by multiple lenses: no human presence anywhere, no capture path for people who will not book, a stale proof stamp, and demos that were dead ends.

The first capture path for visitors who will not book.

A sample viability assessment behind an email gate: real structure, an illustrative scenario, and zero invented client data. It opens even if the form submission fails, and there is always a skip link, so the gate can never trap the document. Roughly 95% of visitors will never book a call, and until this there was nothing at all for them.

Demos stopped being dead ends.

Home page proof cards now open their demo directly, and all ten demos carry a branded return strip back to the site.

The premium pass, measured rather than asserted.

The accent moved from pure yellow to #F0D62B, giving 14.36:1 contrast on black across 90 checked colour pairs with zero failures. A display face for headings in both scripts, which came out 18KB smaller in Latin, with cumulative layout shift at exactly zero.

What broke and was fixed

The production proof stats were stamped "July 2026" and it was August.

Flagged as urgent by the audit, because a stale date on a proof block undermines the exact thing the proof block exists to do. The month is now stamped at build time and rendered per locale, so the copy can never lag a deploy again. It reads August 2026 because the site was built in August.

Earlier Meta advice was wrong and got corrected against live documentation.

Portfolio creation does have an API. It had been reported as permanently interface only. It is actually blocked by the app's access tier, which is a different problem with a different solution. Also learned: ad account creation needs six parameters and there is a lifetime cap of five per user, and standard versus advanced access are two independent gates rather than one ladder.

Scaffolds shipped deliberately inert, and said so.

The person schema omits fields when they are unset, the avatar slot renders nothing, and the acknowledgment email template has no consumer. Nothing renders or sends while empty. The round overran its one hour box and took about two.

7 Aug The homepage stops describing and starts selling

What shipped

The home page rebuilt as a persuasion sequence.

"Nothing about it funnels a visitor onto the call or sets expectations."

That was Tom's verdict on the previous version. The page now runs in order: what the call actually delivers, then an honest three step timeline of what happens after you book, then three self identification cards, then production proof using verified figures only, then the four offerings with prices and an explicit "you do not choose now", then an objections FAQ, then a risk reversal close. A call to action in every section plus a sticky bar on mobile.

"Not worth building is a free answer too" put in writing on the page.
The funnel diagram moved off home.

It now lives only on the how it works page, where someone who wants the structure can find it, instead of taking up the space where the selling should happen.

What broke and was fixed

A cold visitor gate was added to stop this recurring.

Six questions (what is this, what do I get, what happens next, what does it cost, why trust it, what do I do now) must all be answerable from 375 pixel wide screenshots alone. If they cannot be, the page has failed regardless of how it reads on a desktop.

Found and logged, not fixed.

The WhatsApp floating button clips the closing call to action arrow at certain mobile scroll positions. It is still tappable and it is still cosmetic, and it is still on the list three weeks later.

6 Aug 85 findings, and the page that was shipping empty

Two rounds in one day: the ad readiness sweep in the afternoon, the funnel restructure in the evening.

What shipped

An eight lens specialist sweep of the live site.

Copy, information architecture, visual, SEO, accessibility, performance, paid media and adversarial QA. 85 findings, nine of them critical, fixed by three crews and verified with a 72 page load matrix across nine routes, both languages and four viewports.

The funnel restructured around a single call to action.

Free 5 to 10 minute conversation as the only ask, then a standalone ₪250 consultation, then one of four offerings. The ₪250 was decoupled from the viability assessment, which had been bundling two different decisions into one price.

A new how it works page, in both languages, prerendered, in the sitemap.
A 404 page, a skip link, focus rings, and screen reader announcements on form errors.

What broke and was fixed

The site was shipping an empty page and letting the browser fill it in.

The root element in the delivered HTML was empty. Everything a visitor saw was painted by JavaScript after the fact, which meant 82% of the time to largest contentful paint was pure render delay. On a mobile connection that is 7.8 seconds of nothing.

Real rendered HTML now goes into the static shells at build time and the application CSS is inlined, so there is no render blocking stylesheet request. Mobile Lighthouse went from 60 to 100 and largest contentful paint from 7.8 seconds to around 1.3.

Prices were missing "+ VAT" on the format chips.

A price that omits VAT in Israel is not a rounding issue, it is a number the customer will not recognise on the invoice. Critical, fixed everywhere the figure renders.

Every Hebrew call to action rendered the range backwards.

"5 to 10 minutes" came out as "10 to 5" in Hebrew, on every button on the site, because the bidirectional text algorithm was left to sort out mixed numerals on its own. Fixed inside the shared link components so it cannot come back one button at a time, and verified by checking where the glyphs actually landed on screen rather than by reading the markup.

Analytics was loading with the ID literally set to undefined.

On every page, on every load. It has been guarded and made lazy, so it stays completely inert until a real measurement ID exists.

The main call to action shattered into pieces at 375 pixels.

The fix for the Hebrew range problem had split a protected text run across separate flex items, so on a narrow phone the button broke apart mid phrase. Caught by QA before deploy and fixed in the primitives.

Everything else in the sweep.

A 727KB JavaScript chunk split into a 201KB core plus per route pieces. Favicons cut from 314KB to 46KB. Contrast raised to AA site wide, taking accessibility from 95 to 100. Navigation renamed from "AI setup" to "Workspace setup" to match what the pricing page had always called it. Pixel disclosure added to the privacy policy before any pixel existed.

5 Aug Positioning reset: five things taken off the site

What shipped

Geography and demographics removed.

"Israeli businesses" and a ₪2M revenue gate are gone from every rendered string. The audience is now qualified by the kind of problem instead. The Hebrew site, right to left support, the business registration and the tax ID all stay, because those are facts rather than positioning.

Headcount claims removed in both directions.

"OctoMonic is one person", "no juniors", "the client list stays short" all gone. No team, offices or "our engineers" invented in their place. What survives is the actual benefit stated without a number: the developer on the call is the developer who writes the code.

Project counts removed.

No "eleven systems", no "see all eleven", no 01 to 11 card numbering. Selection, not inventory.

The restaurant origin story cut entirely.

The about page is now about how the work is done: approach, judgement, and what the work is held to after launch.

Pricing became four parallel formats instead of a four step ladder.

The free consultation moved out of format one and sits above all four, because every format starts with it. The viability assessment now speaks to idea stage founders first, since that is its volume audience, and states plainly that what is being sold is a technical read rather than market validation or investment advice.

What broke and was fixed

The copy rules file was updated so none of this could regress.

Six new rules written into the header of the file the agents read before writing any copy. This is the same mechanism that later failed on "by hand", where the rule itself was wrong and every agent dutifully obeyed it. The rules file is load bearing, which cuts both ways.

Verified by grep on rendered output, not by intention.

Every route at two widths in both languages, checked for zero rendered hits on Israel, the revenue gate, headcount, first person and claimed tier, outside of legal and timezone context where they are legitimate.

3 Aug The site stops saying "I", and the phone stops scrolling forever

What shipped

The entire site converted to company voice, both languages.
A mobile first pass measured on a real 375 by 812 phone, before and after.
The workspace setup day scoped correctly.

The page had implied staff training and multiple machines were included. It is one person, one machine, one account, and that line now travels with the price everywhere the figure is rendered rather than sitting buried in body copy. Groups of two or more get their own block carrying no price and no booking link, only an enquiry form.

What broke and was fixed

The site was written in first person and Tom hated it.

"It shouldn't say 'I build you' or I anything. I don't want it in first person. Make sure it's corrected everywhere."

First person went from 94 hits to 7 in English and 57 to 4 in Hebrew. The survivors are the WhatsApp prefill strings, which are the visitor's own outgoing message, so rewriting them would have been wrong. Nothing first person renders in visible page text on any route.

The cause was a copy rule that said, in writing, "First person singular. OctoMonic is one person; never we/our team." Every agent had followed it correctly. The rule was inverted in place with the reversal dated and the reasoning written out, so the next agent does not restore the old wording. Recasting was preferred over a reflexive swap to "we", so the page does not read as agency boilerplate.

The work page was 20,178 pixels tall on a phone. About 24 full screens.

All eleven cards were rendering their complete desktop content stacked vertically. The detail now collapses behind a tap below tablet width, hidden with CSS rather than removed, so it stays in the document for crawlers, browser search and screen readers. Desktop is byte for byte unchanged. Down to 8,243 pixels.

311 things on the booking page were too small to tap.

The slot picker was rendering 37 pixel targets in a dense wrap. Zero interactive elements are now under 44 pixels on phone or tablet. The breakpoint for this deliberately sits where the navigation bar itself switches to desktop, so a 768 pixel tablet is treated as the finger device it actually is.

The best thing on the site did not exist on phones.

The animated system graph behind the hero was desktop only. The most designed moment on the site was invisible on the device most prospects arrive on. It now renders under the headline on phone and tablet.

Tablet had never been tested at all.

The contact and workspace enquiry grids were splitting into two columns at tablet width, giving the form a 350 pixel column with 165 pixel input fields sitting beside several hundred pixels of dead space. They now split one breakpoint later.

Desktop spacing was being applied unchanged at phone width.

A quarter of a 375 pixel viewport was being spent on vertical padding designed for a 1280 pixel screen.

2 Aug The rebuild, and everything false that came off the site

Four rounds in one day: the premium rewrite, the outcome led copy pass, wiring the demos, and real bilingual URLs.

What shipped

A real portfolio replacing the placeholder one.

Eleven cards built from actual systems, each with the problem, what was built and its status. Clients are white labelled and never named. Zero usage, revenue, growth or adoption figures anywhere, because there were none that could be defended.

Nine finished demos wired to their cards.

The demos directory already held nine working product demos and only one of them was linked. Each is now led by a real screenshot generated from the demo itself. The two entries with no demo get a graphic panel built from their own logo, so they read as a design choice rather than a gap, and the same panel is the error fallback so a card can never show a broken image.

Real URLs for both languages.

Plus a bilingual sitemap, robots file, per route canonical and alternate language tags, and a second service line at the workspace setup page.

Visual work with no animation library.

An animated system graph behind the hero, count up figures on the proof stats, a tabbed switcher replacing three static lists, and a product mark band on the about page. Right to left and reduced motion are structural rather than patched on: one shot animations always settle, infinite ones keep their resting appearance in the base rule, so collapsing every duration leaves the page static and complete.

What broke and was fixed

The homepage had a counter inventing 40 to 50 "automation hours" every week.

It was displaying 2,484 and climbing. It was not measuring anything. It was a function that added a random number on a timer. Deleted, along with a hardcoded "4+ Key Industries" and a "VERSION 2.1.0 / ALL SYSTEMS NOMINAL" status bar that was also connected to nothing.

Four demo links were broken, empty, or leaking credentials.

Removed. Only health checked links ship now. A retired data file carrying client identifying strings was also deleted, along with a dangling clause about it still sitting in the terms page.

Six strings claimed "no public demo" for demos that existed and worked.
Google could only ever see one language, and the other had no address at all.

Language was a runtime toggle sitting on one set of URLs. Whichever language Google's own request happened to resolve to was the only version it could index. Both languages now have real, separate, indexable URLs.

The browser tab was showing an unrelated purple chevron.

An old favicon file was winning priority over the emblem, which is why the tab looked generic and off brand. Regenerated from the actual mark.

The site's main font was never actually being downloaded.

The stylesheet pointed at Inter and Inter was never fetched, so every visitor was reading a system fallback. Both the Latin and the Hebrew faces now genuinely load.

Every heading on the site was uppercase with wide letter spacing, which made Hebrew harder to read.

Removed globally. Hebrew now drops uppercase, tracking and synthetic italics everywhere, because none of the three do anything good to Hebrew letterforms.

Numbers in Hebrew were rendering backwards and the plus signs were detaching.

Numeric runs were being left to the bidirectional algorithm. Every figure, range and unit is now wrapped in its own isolate at render time, and it was verified by screenshot rather than by reading the markup.

Sparklines were requested and declined, on purpose.

A sparkline asserts a trend, and there was no trend data behind those figures. The stats got a tick meter instead: for a figure of 24 or less it draws exactly that many marks, which is a faithful encoding of the real number, and above that it draws a texture that claims nothing. The count up component treats null as its resting state and renders the source string verbatim, so every failure path lands on the true figure rather than a wrong or stuck one.