Commit Graph

34 Commits

Author SHA1 Message Date
admin c9b9432986 website: the contact pages' share text speaks in the first person too
gates / gates (push) Successful in 6m5s
The voice sweep reached the visible text and stopped there. description,
og:description and twitter:description on both contact pages still said "Irj
nekunk es szemelyre szabott ajanlatot keszitunk" / "Write to us and we will
make a personal offer" - six lines nobody sees on the page and everybody sees
under a shared link, which is where the operator was about to post one.
2026-10-12 14:52:16 +02:00
admin d328147322 website: the share card shows the product, not just the words
gates / gates (push) Successful in 6m13s
The operator went to post the link and found the card out of date: it was the
2026-07-18 design - a headline and two lines of text on a dark field, nothing of
the product, and older than everything the site has become since.

- og-image.png and og-image-en.png rebuilt around the laptop, with the hero's
  own poster frame on its screen.
- scripts/make_og_card.py: the headline, logo and button are lifted as PIXELS
  from the previous card and composited with `lighter` onto flat --bg-0, because
  the site's font is a woff2 and nothing here can draw a glyph with it. A new
  headline therefore CANNOT be made with this script - new words go back to the
  design tool and this takes that card as its source. The lede lines are gone;
  the laptop says what they said.
- ?v=2 on every og:image and twitter:image (20 pages): a scraper caches by URL,
  so a new picture at the old URL would reach nobody. A card already attached to
  a post still does not change - that post must drop the preview and re-add the
  link after a re-scrape.
2026-10-12 14:48:44 +02:00
admin 02be8ea7f0 website: the reviewer's findings - consent error, reply time, sitemap, voice, clip
gates / gates (push) Successful in 6m12s
A page-by-page review of the live site (1440px and 390px) found six defects and
two editorial questions. The operator answered three questions; the answers and
the evidence are in REPORT-review-2026-10-12.md.

Fixed:
- The contact form showed its consent error before any submit, on both pages:
  #privacyError sits outside any .form-group and the hide rule was scoped to
  .form-group. Scoped to the page. Checked: load (none) -> submit unticked
  (shown) -> tick (gone), with no message sent.
- The consent checkbox is the site's own control now: 24px box, keyboard focus
  ring, and a second <label for="privacy"> at 44x44 round it for touch.
- The contact page promised a reply within 24 hours while /feltetelek 1.1 §4
  promises no reply time. Now 1-2 days usually, and no promise during the test.
- sitemap.xml was missing /szolgaltatasok and /en/services: 18 -> 20 URLs.
- The pre-shell mobile-menu script still ran on 20 pages and logged
  "[mobile-menu] Missing elements" on every one. Removed.
- The sidebar's tester button was btn-outline while the hero's was btn-primary.
- The home page's "Mit tud a doboz ma?" was three bare links; each card now
  carries 2-3 of the services page's own items, word for word.
- A plain Facebook link in the footer of all 22 pages. No script, widget or
  pixel: the only external hosts any page refers to are still felhom.eu and
  stats.felhom.eu.

Voice (operator ruling: "I" everywhere a person speaks): contact, tester and FAQ
pages in both languages, and the home and services pages that repeat the same
promises. An inclusive "we" (you and I, talking) stays plural, and the legal
texts are untouched. Each FAQ answer exists twice (JSON-LD + visible) and gate 18
holds them equal - it caught the five answers whose markup split the sentence.

Hero clip rebuilt: Immich first, so the poster is a wall of real photographs;
the Jellyfin scene starts after the demo's library wall (eleven pieces of poster
art whose licence cannot be quoted from a first-party source); 1.3s of blank
screen cut from the OnlyOffice scene. The film that plays, Caminandes 3:
Llamigos, is CC BY per Blender's own video platform ("licence": {"id": 1,
"label": "Attribution"}) - NOT public domain as website/CHANGELOG.md said
yesterday. That sentence is corrected in place and the film is credited under
the hero caption.

New gate 24: sitemap.xml lists every public page once, with its twin's hreflang
pair, and lists nothing else. Decoy: site/sitemap-missing-page, the exact shape
the reviewer found by hand.

site.css ?v=30; hero clip and poster ?v=2.
2026-10-12 14:25:53 +02:00
admin 25ab47eeaa website: the two-tone headings are back, and the home page's sections are ruled apart
gates / gates (push) Failing after 6m59s
Two notes from the operator, 2026-10-12: the white/blue heading split was lost
in the M3 switch and should return everywhere, the apps page categories
included; and the home page's sections ran into one another.

- 41 headings get their <span> back (home 5+5, apps 6+6, FAQ 6+7, services 3+3).
  The style never went away - site.css has styled `h2 span` blue all along; the
  M3 rewrite dropped the markup. No text changed: the span wraps words that were
  already there. The three home headings that predate M3 are split where they
  were split then.
- Apps and FAQ categories are new to the treatment: a name with an & splits
  there, a phrase on its last words. Five one-word headings stay plain.
- The home page's sections get a 1px --line rule with 2.75rem of air on each
  side, so it sits centred in the gap; the first also parts the hero from the
  page. Home page only.
- Blue on the page background measures 7.9:1 - AA at any size.
- site.css ?v=28.
2026-10-12 13:18:59 +02:00
admin 6b6aca900c website: the language menu opened off the left edge of the window
gates / gates (push) Failing after 7m1s
The controller's rule centres the menu on the globe (left: 50% +
translateX(-50%)). On the website the globe sits at the far left of the sidebar
footer, so 60px of the 120px menu hung outside the window and both labels were
cut. Anchored to the button's left edge in site.css instead, opening rightwards
into the sidebar; shell.css stays a verbatim copy.

Measured after the fix: menu x 24->144 inside a 240px sidebar. site.css ?v=27.
2026-10-12 13:07:02 +02:00
admin b0ef27e914 website: the laptop screen moves - six real apps behind the cut-out frame
gates / gates (push) Failing after 7m17s
The operator recorded the six scenes and ruled on their length: use them whole,
"they had been cut as I liked them". Jellyfin, Tandoor, OnlyOffice, Immich,
RomM, Paperless, 0.6s crossfades, 36.6s looping at 904x556.

- hero-clip.mp4 (1 134 KB) + hero-clip.webm (1 295 KB) + hero-poster.webp
  (53 KB), one set for both languages: the recordings are the same on / and /en/.
- The hero <video> sits in the frame's cut-out hole at z-index 1, the frame above
  it at 2. No autoplay attribute: the page's script starts it when the hero is on
  screen, pauses it when it leaves, and never starts it under
  prefers-reduced-motion. With JS off the poster stays.
- make_hero_clip.py reads each scene's own length (ffprobe) instead of cutting
  every one to a fixed window, and the xfade offsets count from the running sum
  minus one fade per transition already made.
- site.css ?v=26 on all 22 pages.

NOT verified: playback in this workstation's Chrome, whose media pipeline loads
nothing at all today (a 1 KB generated WAV blob stalls the same way, with no
error) - which rules the clip out as the cause. Geometry, layering and the
poster frame were verified in the browser.

Jellyfin, Paperless and RomM were filmed on those projects' own public demo
sites; the films in the Jellyfin scene are public-domain prints.
2026-10-12 12:39:31 +02:00
admin bb69a73330 website: four more notes - first person, the globe's well, the touching tables, the submenu label
gates / gates (push) Failing after 5m21s
1. THE HOME PAGE SPOKE ABOUT THE OPERATOR IN THE THIRD PERSON ("Ha irsz, o valaszol")
   while the page it links to is in the first ("Ha irsz, en valaszolok"). Both home
   pages now read "Nagyfenyvesi Viktor vagyok, a Felhom mogott en allok" / "I am Viktor
   Nagyfenyvesi, and I am the one behind Felhom", and the link after it is "Rolam
   bovebben" / "More about me" rather than repeating the question the sentence has just
   answered. The legal pages keep the formal third-person name, which is their job.

2. 36px OF DEAD SPACE UNDER THE LANGUAGE GLOBE, and most of it was A LEAK GATE 22
   COULD NOT SEE. The old chrome's

       nav { position: fixed; top/left/right: 0; padding: 20px 0;
             backdrop-filter: blur(12px); border-bottom: 1px solid var(--line);
             z-index: 200 }

   is a BARE ELEMENT selector, so it matched <nav class="sidebar"> too - and .sidebar
   declares none of those, so all of them were in force on the sidebar. Scoped
   body:not(.shell); the footer row's own padding went 16px -> ~8px.

   Gate 22's first half compares selectors present in BOTH stylesheets, and `nav` is not
   a selector shell.css ever writes, so this shape was outside its field of view. It now
   has a SECOND HALF: an unscoped bare nav/header/main/aside rule in site.css is a
   failure, because those elements ARE the shell (<nav class="sidebar">,
   <header class="mobile-topbar">, <main class="content">). It convicted a second live
   one on its first run: R-903's `@media (max-width:900px) and (scripting: none)
   nav { position: static }` had been overriding the sidebar's own position on a phone
   with scripting off. `footer` is deliberately NOT on the list, with the reason beside
   it: the shell carries the website's own footer.
   Decoy site/bare-element-rule-reaches-shell, seen to convict.

3. THE COMPARISON TABLE AND THE TWO CARDS under "Miert a sajatod?" were touching: .vs
   ends on its own border and .band opens with a 2px blue rule, so they read as one
   block. 2rem between them.

4. "MINDEN ALKALMAZAS" -> "AZ ALKALMAZASOKROL" / "About the apps" on all 22 pages. Every
   app is on that one page, so the first submenu item is not a filter - it is the top of
   the page, where the intro and the "Fontos tudnivalok" box are. The en-nav-drift decoy
   was re-anchored on the new label.

Checked at 390px and 1440px on all 21 pages: no sideways scrolling, footer inside the
content column, the renamed item on every page. site.css?v=25.
2026-10-12 09:32:16 +02:00
admin 0ef0b106f6 website: the operator's seven notes - a services page, the hero, and 100 dead links
gates / gates (push) Failing after 6m51s
Reported from his own screens. Five defects, two design.

1. THE CATEGORY ANCHORS WERE DEAD - all 100 of them. The sidebar's five app-category
   links pointed at #fajlkezeles-irodai and friends; the ids are #fajlkezeles and
   friends. The sidebar is copied into every page, so one wrong fragment was wrong
   twenty times, and a dead fragment raises no error anywhere: the browser stays put.

   New gate 23 resolves every in-site #fragment against the page it names (360 today).
   It convicted two more on its first run: the home page's four hero tiles pointed at
   /alkalmazasok#immich, which no page had ever carried, and the FAQ's contact button
   pointed at a home-page section that had moved out. Every app card now carries its
   slug as an id - taken from the card's own logo file, which gate 21 already ties to
   the catalog, so the ids cannot drift from it silently.
   Decoy site/dead-fragment puts the operator's own bug back and the gate convicts.

2. SZOLGALTATASOK IS A PAGE: /szolgaltatasok + /en/services, registered in TWINS, URL
   and SHELL. The ten capability items moved VERBATIM out of the home page; the home
   keeps the promise sentence, the three group names as links and a button, and is 345
   Hungarian / 434 English words shorter. The .caps rules stopped being .page-index-
   scoped, because the block now lives on a page with a different body class.

3. THE HOME HEADLINE is back in the hero column beside the picture, two lines with the
   second in --blue-bright at clamp(2.1rem, 4.4vw, 3.2rem). M3 had moved it into
   .page-header - the INNER pages' heading - so it shrank to 2.1rem and the domain
   badge was stranded beside it.

4. THE HERO PICTURE is the real dashboard in a laptop. The frame is the operator's own
   supplied render; the screen is dashboard-start-{hu,en}.webp composited into it, so a
   visitor sees a real box's Launcher rather than a drawing of one - the supplied
   screens are AI-drawn and misspell app names. 57 KB, named dashboard-laptop-<lang>
   so gate 19 holds it to the page's language.

5. .page-lede HAD NO CSS AT ALL on 16 pages: a bare paragraph, full width of the
   content column, hard against the box beneath it. 760px measure, centred over the
   box, air beneath; left-aligned on /szolgaltatasok, which has no centred box.

6. THE SIDEBAR LOGO: the wordmark shipped at 0.67x the mark's width where the real
   lockup (assets/logo.png, measured: mark 492px wide, wordmark 631px) has it at 1.28x.
   Mark 112px, wordmark 25px tall, 28px less vertical padding.

7. SCROLLBARS are the page's own now. The first attempt missed the viewport's: it is
   painted from <html>, and a `body.shell ::-webkit-...` rule only reaches scrollers
   inside the page.

Also: the two Latin font subsets are preloaded. With font-display: swap the page
reflowed after first paint - measured at 1339px on /alkalmazasok#media.

Checked at 390px and 1440px on all 21 pages: no sideways scrolling, footer inside the
content column everywhere, drawer opens with all 13 items. site.css?v=24.
2026-10-12 08:58:42 +02:00
admin 5aeb36b5bd website: fix the phone menu and the footer column - both live defects
gates / gates (push) Successful in 6m42s
Reported from a real phone. Both were mine, both shipped in the switch.

1. THE PHONE MENU WAS EMPTY. The drawer slid open correctly but had no items in
   it. site.css's OLD mobile nav was still reaching the shell's sidebar: under
   @media (max-width: 900px) it sets .nav-links to position:fixed; right:-100%,
   which parked the menu off-canvas INSIDE the drawer. Measured at 390px and
   860px: position fixed, right -280px.

   The cause is a hole in my own check. At STOP 1 I diffed the two stylesheets'
   declaration sets and found "exactly six" leaking declarations - but that diff
   EXCLUDED @media blocks. Re-run media-aware, the real number is FORTY, and the
   worst of them only apply below 900px, which is why desktop looked right and a
   phone did not. A check that silently skips part of its subject is not a check;
   this one reported a confident, wrong number.

   Fixed at the source rather than per-property: every selector belonging to the
   website's OLD chrome (nav, .nav-links*, .mobile-overlay, .hamburger, .logo*,
   .lang-globe-li - 29 occurrences) is now scoped `body:not(.shell)`. Scoped, not
   deleted, so a future non-shell page still works. .hamburger-box and
   .hamburger-line are deliberately left unscoped: the shell's burger uses them.
   Leaks after the fix: 40 -> 0.

2. THE FOOTER RENDERED AS A SECOND COLUMN at the top right on 16 pages. body is a
   flex row on a shell page, and my insert only moved the footer inside <main>
   when the page ENDED with </main>; pages with scripts after it fell through and
   left the footer as a direct child of body, i.e. a flex sibling of the sidebar.
   Moved inside <main> on all 16, each move asserted to have landed inside.

Both are now gated: gate 3b requires every shell page's footer to be INSIDE
<main class="content">, red-proofed by putting one outside and watching it convict.

site.css?v=23 / shell.css?v=23.
2026-10-11 16:25:01 +02:00
admin 6059505216 website: M3 goes live - the whole site switches to the controller's shell at once
gates / gates (push) Failing after 13m11s
Part D. Every public page now wears the controller's frame around the website's
own content. One commit, as asked: never half old, half new.

  20 pages switched (12 Hungarian incl. the hidden prices page, 8 English)
  website/preview/ deleted entirely - A, M1, M2 and M3 studies all gone
  robots.txt: the Disallow: /preview/ line removed with them
  site.css?v=22 / shell.css?v=22 on every page

PROVED before pushing, not after:
  * HEAD TAGS: title, meta description, keywords, author, robots, canonical, every
    hreflang, all seven Open Graph tags, all four Twitter tags and the JSON-LD
    captured on all 19 pages before the switch and compared after. The ONLY
    difference anywhere is the dash substitution inside the two FAQ pages'
    FAQPage JSON-LD - verified by applying the same substitution to the "before"
    copy and getting an exact match. Nothing else moved.
  * VISIBLE TEXT: identical to the live pages word for word, legal texts identical
    with no substitution permitted at all.
  * No page is left noindex (the two download pages' noindex,follow is their own,
    pre-existing and unchanged), no page mentions /preview/, every page has a
    footer, no page overflows at 390px.

THE HEAD-TAG DIFF EARNED ITS PLACE. The home page was about to ship carrying
`noindex, nofollow` from the preview, and had lost meta keywords, meta author, all
seven Open Graph tags, all four Twitter tags and the LocalBusiness JSON-LD -
because its head was hand-built while every other page carried its live one over.
The diff caught it; nothing on the rendered page would have. The generator now
uses the live head for EVERY page including the home one.

szolgaltatasok-nonpublic.html was converted too. It is in no menu and was not in
the brief's list, but leaving one page on the old chrome would have left the site
half-switched - which is the one thing part D was not allowed to do.

scripts/site_gates.py: SHELL is now the real page set; MOCKUPS is empty; gate 3's
old nav/footer loop keeps working for any page added later WITHOUT the shell, and
skips the ones that have it.
2026-10-11 15:57:35 +02:00
admin 91ba50ea2c website: the sidebar button fits when the apps group is open
gates / gates (push) Failing after 13m42s
On /alkalmazasok the Alkalmazasok group renders expanded, which gives the sidebar
a 16px scrollbar and narrows it from 239 to 224. At .95rem the Hungarian label
wrapped to two lines there (the English one still fitted, which is why it showed
on one page and not its twin). Sized to the narrow case, measured not guessed.
2026-10-11 14:23:16 +02:00
admin f6044dc0a7 website: long checksums and URLs no longer scroll a phone sideways
gates / gates (push) Successful in 8m15s
Measured at 390px on the LIVE pages, so this is pre-existing and not something the
shell introduced:
  /letoltes    scrollWidth 609 - the 64-character SHA-256 inside <code>
  /adatkezeles scrollWidth 478 - a long facebook.com legal URL used as link text
and the same on their English twins.

overflow-wrap: anywhere changes only where the line breaks; selecting and copying
still yields the whole unbroken string, which matters for a checksum. The legal
pages' words are untouched - this is CSS.

Small enough to fix in the session rather than file.
2026-10-11 14:16:59 +02:00
admin 11242c5110 website: AA on the shell's copied button and group label
gates / gates (push) Successful in 6m58s
Measured on the deployed M3 page: .btn-primary 4.01:1 (white on --blue, 13.6px/600)
and .nav-group-label 3.14:1 (--text-3), both under the 4.5 floor.

This is R-930 arriving a second time by a different route: fixing .cta-button on
the website did not fix the CONTROLLER's button, and the shell imports it. Same
remedy the operator already chose - 1.2rem/700 puts the label in WCAG's large-text
band where 3:1 applies - so --blue stays untouched.

The sidebar's own CTA becomes an OUTLINE button rather than a filled one: blue on
transparent passes comfortably, and a 19.2px filled button does not fit a 240px
sidebar without wrapping. Measured both ways rather than guessed.

The controller has both defects on its own surface. Not fixed here - that repo is
read-only this session - so it is going to the register.
2026-10-11 13:58:07 +02:00
admin cada79e990 website: M3 home page has one heading, not two
gates / gates (push) Successful in 7m21s
The page header and the hero both carried a title, which read as two headings
stacked. The brief's shape is one: .page-header holds the h1 - and it holds
today's indexed headline, 'Sajat felhod, sajat szabalyaid', unchanged - and the
hero row below is the lede sentence plus the button beside the dashboard window.
2026-10-11 13:52:48 +02:00
admin 71df90f9fc website: neutralise the six declarations that leak into the shell
gates / gates (push) Successful in 7m3s
shell.css loads after site.css, but later-wins is per PROPERTY, not per rule.
Where site.css declares something the controller's rule does not, the website's
value survives inside the shell. Measured: exactly six declarations, three
selectors, and the first one was visibly broken on the deployed page -

  .nav-links        display:flex + gap:32px -> the sidebar menu rendered as a
                    HORIZONTAL row spilling across the content column
  .lang-globe-menu  top + right -> fought the controller's bottom/left
  .page-header      padding + text-align -> the website's centred subpage header
                    fought the controller's left-aligned flex row

Reset in site.css, the website's own file, so shell.css stays a verbatim copy.
Found by diffing the two files' declaration sets per selector rather than by
spotting the one that happened to be visible.
2026-10-11 13:51:23 +02:00
admin bb88e73f9e website: the home page's who-mini row sits under the button, not beside it
gates / gates (push) Failing after 6m44s
.close-cta is text-align:center, so an inline-flex row flowed onto the same line
as the CTA button and pushed the whole group off-centre. flex + max-width 34rem +
margin auto puts it under the button as a centred block, with the hairline above
it spanning the row rather than the section.

Caught by looking at the deployed page rather than trusting the markup.
site.css?v= -> 14.
2026-10-11 09:24:53 +02:00
admin fb9fe0808d website: "Ki all mogotte" moves to the contact pages; the home page keeps a trace
Operator's call after seeing the preview: the biography sat between the dashboard
gallery and "Hogyan mukodik?", interrupting "what it does" -> "how you get it"
with a life story. And its last sentence, "Ha irsz, en valaszolok", is a contact-
page sentence - it belongs next to "Valaszido", not mid-product-story.

  /kapcsolat + /en/contact  gain the full block (photo + the five approved
      sentences). These are LIVE pages, so the bio and the photograph are public
      from this commit. Both halves of the twin move together, as the twin rule
      requires; the English promises nothing the Hungarian does not, and uses the
      site's established "the box" rather than a new term.

  /preview/  loses the section and gains a compact row in the closing call to
      action: a 56x70 portrait, one line, and a link to the full block. This is
      deliberate, not a compromise - the audit's R-11 finding was "nobody is
      behind it" on the HOME page, and deleting every human trace from it would
      re-open exactly that. The trace now sits where someone decides to write.

  A dedicated /rolam page was considered and rejected: five sentences cannot
      carry a page, and the alternative was inventing biography to fill one.

The .who* rules are now UNSCOPED (were .page-index .who*), because the block
lives on two pages and will live on the home page's twin later. Following
69035f4af5's lesson: a genuinely shared pattern goes site-wide rather than being
duplicated per page scope. No existing page uses .who, so nothing else moves.

assets/operator-portrait-small.webp - 160x200, 8.4 KB, cropped from the same
original outside the repo, metadata stripped and verified by read-back (0 EXIF
tags, 0 GPS entries, none of the phone's byte sequences present).

site.css?v= -> 13 on all 21 files.

The preview builder asserted a hardcoded "site.css?v=10" and broke the moment the
site moved to 12. It now follows whatever index.html pins and prints it.

site_gates.py green.
2026-10-11 09:22:27 +02:00
admin 43b67283c3 website: the footer dash swept site-wide, and the primary CTA meets WCAG AA
gates / gates (push) Failing after 14m58s
Two operator decisions from STOP 3, both independent of the home-page switch,
which was NOT approved and has NOT happened. index.html still serves the old
design; only the footer line and the button change on it.

1. The footer em dash, on all 21 page files (12 HU + 8 EN + the preview).
   "(c) 2026 felhom.eu - Sajat felhod..." now uses the spaced en dash, which is
   the correct Hungarian gondolatjel. Done as one sweep because site_gates.py
   gate 3 requires every page in a language set to carry an IDENTICAL footer, so
   this could never have been a one-page edit. Gate green: all 14 still match.

   Scope, stated honestly: this clears the footer only. 300 em dashes remain in
   the BODIES of the other 19 pages (gyik 53, en/faq 53, adatkezeles 33,
   szolgaltatasok-nonpublic 27, testing 24, teszteles 23, index 17/19, ...). The
   preview page is the only page at zero. The rest is NEXT.md work, page by page.

2. R-930, the operator's choice of the three offered: white on --blue measures
   4.01:1, under WCAG AA's 4.5:1 for body text. .cta-button goes to 1.2rem/700,
   which is >=18.66px at >=700 weight, so WCAG counts it as LARGE text and the
   floor becomes 3:1 - which 4.01 clears without touching --blue. Darkening the
   token was rejected because --blue is shared with the hub and controller UIs.
   Horizontal padding trimmed 32->26px to protect the one-line rule for the
   longest label; verified in the browser at 390px, not assumed.
   .cta-button-secondary is unchanged: it already measures 7.17:1.

   This reaches the primary button on 16 pages, which is the point - the defect
   was never the home page's.

site.css?v= bumped to 12 on all 21 files. The pages sat at v=10 and the preview
at v=11; leaving them split would have served a returning visitor the old
stylesheet and the change would have looked like it did not deploy.

site_gates.py green.
2026-10-11 00:25:43 +02:00
admin 69035f4af5 website: the tester pages get the design system, and content links stop turning purple
gates / gates (push) Successful in 6m34s
Root cause of "no formatting for the points": .info-card and .highlight-box are
scoped per page (.page-technologiak / .page-biztonsagimentes) and the new pages
carry .page-teszteles, so NONE of the card chrome applied - the sections were
unstyled text runs. The tester pages now join the technologiak scope, whose h3
is a flex row (these headings carry an icon).

Three more gaps the new pages exposed, all fixed site-wide rather than patched:
  - There was no base `a` rule at all, so an inline link in body copy fell back
    to the browser default and changed colour once visited. .legal was the only
    place this had been fixed. /gyik, /technologiak and /biztonsagimentes each
    carry such links and had the same bug.
  - `code` was styled only under .legal.
  - A <ul> inside an info-card was unstyled: wrong colour, wrong indent.

Justified body copy on the tester pages, as asked. NOTE: no other page
justifies today, so this is deliberately scoped to .page-teszteles and can be
rolled out site-wide or dropped in one edit. hyphens:auto, because Hungarian
sets badly when justified without it.

site.css -> v=10 on all 20 pages.

sitemap.xml: BOM removed. Search Console shows the freshly submitted clean
sitemap as "Sikertelen lekeres" with an empty last-read, and a BOM before the
XML declaration is a known irritant for its parser. The file is otherwise valid
(18 <url>, parses, served 200 as application/xml). No gate covers sitemap.xml
and the BOM rule is for website/*.html only.

Facts corrected - there are NO testers (operator, this evening): "Tester 1" is a
disposable virtual box and "Tester 2" is a friend whose machine is unassembled
and switched off. The page said "Nehany hely mar betoltve", which was untrue; it
now says the test is starting and all 5 places are open. Same correction in
OUTREACH.md (five people needed, not three), CONTEXT.md, and the terms-1.1 mail,
which in practice has one recipient, not two. No scheduled post claimed a
filled place, so none needed editing.
2026-10-10 20:40:43 +02:00
admin ec5605d42c register shrink 2026-10-10: 13 rows closed with live evidence (138 -> 125); R-903 phone menu without JS; R-910 pictures; R-912 site gate 21
gates / gates (push) Successful in 6m4s
Closed: R-906 R-907 R-909 R-910 R-911 R-815 R-756 R-570 R-896 R-912 R-903 R-338 R-916.
Updated: R-899 (press set up, dated check 2026-10-11), R-243 (the mail is due 2026-10-11 ~16:06Z, dated check),
R-782 (homepage live; glance question to the operator), R-904 (the TLS sentence is in 01 s7).
Website: site.css v=9 (scripting:none menu), eight dashboard pictures retaken. Evidence: audits/register-shrink-2026-10-10/.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 15:27:59 +02:00
admin fe80548144 website: the header mark had no white fill — wrong source file (and R-916 corrected)
gates / gates (push) Successful in 5m36s
I used assets/logo_notext.svg for the header mark. That file is the
LIGHT-BACKGROUND variant: it has SEVEN #00408d fills and ZERO #ffffff, so on
the dark nav the cloud rendered as a hollow outline. The operator caught it.

logo_notext_white.svg is not the answer either -- it is a white OUTLINE
version, also unfilled. Rendered all four candidates side by side on the real
nav background to see it rather than infer it: only logo.svg (and logo.png)
carry the real artwork -- white cloud, #051343 house and servers, #008ddf
swoosh.

FIX: assets/logo-mark.svg, cut from logo.svg -- keep <defs>, path6 and g2;
drop the five wordmark paths and the two empty <text> elements; viewBox
cropped to the mark (70 0 505 295). Vector, correct fills, no text.
All 18 pages point at it; site.css cache-bust v7 -> v8. The CSS comment now
says which file NOT to swap back in, and why.

AND A CORRECTION THAT REMOVES AN OPERATOR TASK (R-916). That row says the
project has no usable vector master because logo.svg "sets felhom.eu as live
text" in 'M+ 2c'/'Vremena Grotesk', and it waits on "the machine with the
fonts". MEASURED today, while cutting the mark out of that very file:

  - all five wordmark elements are <path> with real d= geometry
  - NO <text> element has any content; the two present are empty leftovers
  - the font-family strings the row cites are Inkscape METADATA left on
    CONVERTED paths (-inkscape-font-specification). A grep for font-family
    finds them and reads as live text -- the likeliest way the original
    diagnosis went wrong.
  - proof from a renderer that lacks both fonts: Chrome draws logo.svg's
    lettering identical to logo.png's, side by side.

NOT re-tested: librsvg specifically -- DooPlex has no rsvg-convert, inkscape
or cairosvg installed today, so the original librsvg/DejaVu observation could
not be reproduced either way. It does not change the structural fact: there
is no font left to substitute. Consequence: the 645x408 PNG is not the only
faithful copy and does not cap picture size.

R-916 state -> READY with "re-check before doing any work: this may need
nothing from the operator at all", rather than closed on my say-so.
2026-10-09 14:28:22 +02:00
admin 625d38645c website: one brand lockup in the header, and footer links that look like links
gates / gates (push) Successful in 5m54s
HEADER. logo.png carries its OWN "felhom.eu" lettering under the mark, so
putting it next to a typed <span class="logo-text"> said the name twice and
squeezed the mark down to 40px to make room. Now:
  - the mark alone, bigger: assets/logo_notext.svg at 54px (44px under 600px).
    Vector, so it stays crisp. Its two <text> elements are EMPTY, so R-916's
    missing-font problem does not apply to this file -- checked, not assumed.
  - the name beside it is the brand's OWN lettering, cropped from logo.png to
    the new assets/logo-wordmark.png (632x108, tight bbox).

Why an image and not text: the wordmark's face is "M+ 2c"/"Vremena Grotesk"
(R-916). Nothing here has it, and the site deliberately loads NO external
font -- the privacy notice published this morning states exactly that, so
pulling in Google Fonts to match a logo would have made a published claim
false. Using the artwork is also what the Facebook covers already do. The
white/blue split the operator asked for is in the artwork itself.

Accessibility kept: the mark is alt="" aria-hidden (decorative), the wordmark
carries alt="felhom.eu", so the link still has its accessible name.

FOOTER. The legal links were unstyled, so the browser painted them default
blue and PURPLE once visited. They now follow the site's own convention
(.page-kapcsolat .sidebar-card a): --blue-bright, no underline, underline on
hover. :visited is pinned to the same colour deliberately -- a legal link
that changes colour after one read looks like it stopped working. The same
fix applied to .legal a on the two new legal pages, which had --blue instead
of --blue-bright.

18 of 18 pages carry the new lockup; the English pages keep their /en/ logo
href. site.css cache-bust v6 -> v7 on all 18, per the website rules. Verified
rendered in a browser on both a Hungarian and an English page: both images
load, no .logo-text left anywhere, footer links computed rgb(46,168,245).
site_gates OK (nav/footer per language, BOM, cache-busting, twins).
2026-10-09 13:47:22 +02:00
admin 30b932bb10 website: publish the closed-test legal set (R-813 narrowed)
gates / gates (push) Successful in 5m34s
Two new Hungarian pages, live on push: /adatkezeles (privacy notice) and
/feltetelek (what the free closed test is, and is not). Operator rulings of
2026-10-09: no company exists yet, so the operator is named as a PRIVATE
PERSON with no postal address and no phone; publish before the lawyer has
seen it, because the site was collecting data with no notice at all; the full
ASZF, the impresszum and the review wait for the company (R-802, R-809).

- All 18 pages carry the operator, info@felhom.eu and both links in the
  footer. Counted, not assumed: 18 pages found = 18 with both links = 18
  structurally valid. English footers say the legal texts are Hungarian.
- The contact form stopped claiming something untrue. The old consent said
  "az adatokat harmadik felnek nem adjuk ki" while Resend, Cloudflare and
  Google carry the message. Both languages replaced; the link opens in a new
  tab so a filled form is not lost.
- site_gates.py NO_TWIN gains the two pages ON PURPOSE, with the reason in a
  comment: an unreviewed English legal text would be worse than an honest
  pointer from the English footer.
- documentation/legal/{adatkezelesi-tajekoztato,feltetelek}-1.0.md are the
  text of record, DERIVED from the published HTML so they cannot drift. The
  drafts are kept and marked superseded for the closed test.

FOUR LOAD-BEARING CLAIMS WERE MEASURED, not copied from a vendor or a README:

  cookies      zero, and no local storage - checked in the browser WITH A
               POSITIVE CONTROL (a probe cookie WAS visible to the same
               method) after the tracker fired; no Set-Cookie on any response
  beacon       the exact Umami payload: site id, screen, language, title,
               url, referrer - no visitor identifier
  Cloudflare   DNS only: the public A record 37.191.56.193 is not a
               Cloudflare address, so site traffic cannot be proxied
  fsn1         Falkenstein, Germany (Hetzner's own location list)

Also measured: felhom-ep0-copy-gc.timer is installed and RAN SUCCESSFULLY
(2026-10-09 08:00, exit 0), so "deleted within 30 days" is true today where
on 2026-10-08 it was written but not switched on.

Three retentions are stated as having NO deadline, deliberately and with the
operator's word: website statistics, web server logs and contact messages
have no automatic deletion, and the pages say so instead of promising a date
nothing enforces. Every other period is enforced by configuration and cited.

No placeholder survived onto either page (0 of "[[", control: the draft still
has 36). The impresszum and the full ASZF are NOT published.

R-813 -> NARROWED. R-915 unblocked: the operator enters the two URLs in the
Meta app's Basic settings; the Live switch stays a separate decision.
R-917 and R-920 -> DEFERRED on the operator's (c): park, publish as posts
once posting starts.
2026-10-09 12:11:37 +02:00
admin 79c53b5f1a website: one picture viewer (assets/gallery.js) for app and dashboard pictures — declared data-gallery sets, a click on the big picture closes, JS-off still opens the file; site gate 20 + 4 decoys; demo-hp language read back (hu); R-908 (old Resend key in homelab-manifests history); 131 -> 132
gates / gates (push) Successful in 4m25s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-08 13:14:24 +02:00
admin aaac24b05c website: the dashboard shown — 4 real screenshots per language on the home page, 2 on the technology page (controller 0.303.0, demo-hp household guest, privacy-scanned); site gate 19 (pictures in the page's language) + decoy; R-906, R-907 (dashboard defects seen); 129 -> 131
gates / gates (push) Successful in 4m12s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-08 12:47:48 +02:00
admin 803af4798d website: the language switch becomes a globe like the dashboard's (Magyar / English list, current marked, no JS); site.css v3; gate 13 checks the globe from one LANGS list; 5 decoys
gates / gates (push) Successful in 3m54s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-08 09:13:23 +02:00
admin 67b3fd23d1 website refresh: true numbers (56 apps), claims checked against the capability map, ten missing apps, an English twin of every public page (public, choice B), 404 page; site gates 13-18 + 11 decoys; R-902 opened
gates / gates (push) Failing after 13m1s
Part A: claim table documentation/audits/website-refresh-2026-10-08/claims.md; "100% open source" corrected
from the licence read; unbacked claims cut (firewall, RAID, snapshots, new-machine restore, self-managed
mode, household VPN, "never lost"). Part B: dawarich, docmost, grimmory, homebox, karakeep, mealie, metube,
radicale, recipe-importer, sparkyfitness cards; plant-it and wger cut (not offered). Part C: /en/ twins,
nav language switch, hreflang both ways, sitemap with xhtml:link, og-image-en.png. Part D: site_gates.py
twins/lang/same-apps/no-Hungarian/FAQ-JSON-LD/tail. Operator ruling 9 + choice B in 10-localisation.md §11,
§10.7. Register: R-902 (contact mailer source in no repo); R-813, R-784, R-559 annotated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-08 08:29:17 +02:00
admin 916d936332 website: restore the index grid background
Git archaeology: the grid was never a deliberate removal. It lived as a fixed
`body::before` in index.html's inline <style> block and was dropped when bed8675
("D3 Part 2: index + kapcsolat on design system v2") migrated the page onto
site.css. dd54e4c, which created site.css, has no body::before — it was a
porting omission, and nothing took its place. No asset was lost; it was pure CSS.

Restored at its original geometry and subtlety (50px cells, 1px lines, 3%), not
redesigned. Only change: the accent is the v2 --blue #0083D8 instead of the
retired legacy #0088cc, which site_gates.py bans. Scoped to body.page-index
because index is the only page that ever had it.

site.css cache-bust bumped to v=2 across all seven pages (nginx caches 7d).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nn3VgQk9iwEGgyx6QJ2NvE
2026-07-19 09:03:03 +02:00
admin be2fc507bf website: pre-Facebook content refresh — capability-map alignment + Zárt teszt landing
Audience shift: a Facebook post recruiting volunteer testers is about to send real
Hungarian households (mostly on phones) to a site that until now had zero stakes.
Every claim re-checked against documentation/architecture/00-capability-map.md.

- Naming ruling: "Felhő Felügyelő" removed site-wide (14 occurrences, now 0). The
  brand is Felhom; the interface is the vezérlőpult.
- index.html: new "Mit tud a doboz ma?" (8 map-traceable cards, incl. Hálózati
  megosztás and the customer-only recovery code) + new "Zárt teszt" section with
  stated limitations (one shared household password; TV-re streamelés hamarosan).
  CTA reuses the existing live contact-mailer via /kapcsolat?tema=zart-teszt.
- og:image was a site-wide 404 (pages pointed at a .png that never existed) —
  generated a branded 1200x630 card + width/height/alt. Load-bearing for the post.
- App count 45+ -> 53 (real catalog count).
- Cut unbacked claims: the Kubernetes/k3s section + multi-node tier, Tailscale ->
  WireGuard, the RAID card -> honest two-tier backup, gyik multi-user answer
  (both JSON-LD and visible copies), and the "azonnal értesítést kapsz" overclaim.

site_gates.py green. Mobile measured at 380px: scrollWidth == clientWidth == 365.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N1W4wBum4JSFrbaEoDkMBy
2026-07-18 21:27:10 +02:00
admin bed8675930 D3 Part 2: index + kapcsolat on design system v2
- Both pages: Google Fonts links + preconnects removed; ONE stylesheet
  (/assets/site.css?v=1); embedded <style> blocks deleted; body classes
  page-index/page-kapcsolat; canonical nav/footer (active marker per
  page; index's #szolgaltatasok href normalized to /#szolgaltatasok);
  all emoji -> sprite icons (feature tiles = .ico-tile 48px bg-2
  squares; headings .ico-lg; inline .ico) or plain text.
- kapcsolat: the contact form is functionally frozen — every field
  name/id, the submit JS, and the /api/contact endpoint byte-identical;
  only the visual layer changed (upload/paperclip + file-type icons as
  sprite refs in JS strings, the x button as &#215;, status-message
  emoji prefixes dropped).
- site.css: CSS-generated marks (content '✓'/'✗'/'⚠'/'★ …') replaced by
  currentColor mask-based marks / plain text (emoji-free stylesheet;
  gate now scans it too); .ico-tile is svg-as-tile (immune to container
  display rules), .ico-lg added.
- Gates: zero failures for the two converted pages; the remaining five
  convert in Part 3.
2026-07-02 22:06:27 +02:00
admin f82fa9be2c favicon to svg 2026-02-26 13:21:55 +01:00
admin 652d567864 updated favicon 2026-02-26 13:17:14 +01:00
admin af0ab5060f modified files to UTF-8-BOM 2026-02-11 09:52:41 +01:00
admin 0b144a4d24 initial move to gitea 2026-02-11 08:50:08 +01:00