Changelog
All notable changes to the JaySync-Lab configuration and documentation.
Dates reflect when changes were committed to the repository. The raw,
technical version of this log is also kept at
CHANGELOG.md
in the repository root — this page is the published, reader-facing copy.
2026-07-11
The site's homepage, Architecture, and
Services pages have always been driven by a
structured inventory file — but that file lived as a hand-maintained
copy inside jaysync-lab-site, separate from this repository's own
infrastructure/inventory.yaml. That's exactly how the site's CT 105
entry silently went stale earlier: the fix landed here, but nothing
ever told the site's own copy about it. That gap is now closed —
jaysync-lab-site pulls infrastructure/inventory.yaml automatically
on every push, the same way it already pulled /docs, and a push to
either now notifies the site to rebuild.
Reconciling the two copies before wiring up the automation surfaced two real, previously invisible problems in the source file itself: it was missing the host hardware block the site's homepage needs to render at all, and CT 105 was recorded on the wrong VMID band. Both fixed here. It also turned up a genuine design question: this file already described CT 180, the playground's golden template — a real inventory entry, but not a running service, since Proxmox templates don't have an IP or a live status. Rather than hide it or misrepresent it as "active," it's now marked explicitly as a template, and the site shows it transparently: listed and labelled on the services page and the architecture diagram, but correctly excluded from the live-services view and the "active containers" count.
Elsewhere, all four of the org's READMEs got a real accuracy pass —
jaysync-lab-site didn't have one at all, and jaysync-lab-playground's
still described the state from partway through Phase 3, well after
Phase 4 had already shipped and gone live. All four now cross-link each
other and reflect what's actually true today.
The playground also picked up a proper feedback loop: a form at jslnode.anujajay.com/feedback that turns a real visitor submission into a labeled GitHub issue — guarded by a honeypot field and a per-IP rate limit so it can't be trivially abused — plus two emails sent automatically through the existing Resend integration: one notifying the maintainer with a direct link to the new issue, and, if the visitor left an email, a genuinely personalized thank-you quoting their own message back to them. Every outgoing email — this new pair, and the existing offline-recovery notice — now shares one visual identity, including a small logo header reusing the site's own icon.
Also fixed, found only once someone actually watched the page for a few seconds rather than just glancing at it: an animated decorative element on two pages was quietly leaking outside its own box and periodically convincing the browser there was more content below the fold than there really was — showing up as a scrollbar that flickered in and out every few seconds. Root-caused by directly measuring the page's scrollable area over time rather than guessing, and fixed by containing the animation the same way an existing, unaffected page on the site already did correctly.
2026-07-10
Two real, live bugs got fixed the way most of the good fixes in this project happen — by not trusting that something worked just because the code looked right. The playground's new on-screen mobile Ctrl toolbar passed every automated test against an emulated phone screen, but didn't actually work on a real iPhone; it turned out real mobile Safari handles viewport sizing differently than any emulator does, which the fix now accounts for directly, confirmed afterward on real hardware. Separately, scrolling with a mouse wheel inside a playground session was cycling through shell history instead of scrolling the terminal — traced back to a single missing setting in the golden template's terminal multiplexer configuration, fixed via a full template rebuild and confirmed against a live session.
The playground also gained a live view of the actual host's CPU and memory load, gated behind a Proxmox permission grant scoped narrowly enough to allow nothing beyond that one read.
Both public sites got a real mobile pass after actual phone testing turned up rough edges no desktop browser would ever show: a diagram that scrolled sideways with no visual hint that it could, a status line that wrapped awkwardly on the narrowest screens, and a splash animation that only played once per browser tab instead of every visit. All fixed, plus a small dismissible note suggesting a full computer for anyone visiting the playground from a phone, since a real terminal is still easier to drive with a keyboard.
2026-07-07
The playground's session controller — the piece that actually spins up an isolated terminal for a visitor and tears it down again — is live and tested against the real hardware.
The container that now runs it (CT 105) used to host an old, unused documentation experiment that was never wired into anything real. That's been retired, and CT 105 has been rebuilt as the playground controller: it sits on both the lab's normal network and the playground's own isolated network segment, and it's the only thing that bridges the two — every session's traffic passes through this one deliberate chokepoint, and nowhere else.
Getting there took a proper security pass first: rather than give the controller broad access to the Proxmox host, it was issued a narrowly scoped API token — allowed to clone and manage playground sessions specifically, nothing more.
The most interesting part of getting this working was the testing itself. A full pass through six real-world scenarios — starting a session, blocking commands that shouldn't be available, letting a session time out, closing the browser tab early, hitting the concurrency limit, and checking nothing was left behind — turned up three real bugs that only showed up once real terminal traffic was flowing:
- The very first handshake a real terminal client sends broke the relay immediately, so no one could actually get a working terminal
- Closing the browser tab didn't reliably end the session on the backend the way it was supposed to — the cleanup logic wasn't watching for that case
- A container-configuration setting that had already been fixed once elsewhere quietly resurfaced in the freshly rebuilt template, which froze every new session's shell before a visitor could type anything
All three are fixed, and all six scenarios now pass end-to-end. Also discovered — and fixed — along the way: the template every session clones from had its terminal server listening on an address that was only reachable from inside that one container, a leftover from before the controller's network design existed. That's now fixed too, with the template rebuilt and re-verified before going back into service.
With CT 105 now genuinely running the playground controller, the old documentation-engine page has been retired — see the new Playground Controller page for what actually lives there today.
2026-07-06
The Proxmox host came back online after being unexpectedly offline for about three and a half days. The cause couldn't be pinned down — nothing in the logs pointed to a crash, which suggests a power interruption rather than anything software-related. Before resuming any work, a full backup of every container and VM, plus the host's own configuration, was taken and verified — standard practice before touching infrastructure that's just come back from an unplanned outage.
2026-07-03
- Migrated all lab documentation into a structured
docs/folder with consistent metadata (title, description, publish status, icon) so every page renders correctly and navigates predictably on the site - Added
RULEBOOK.md, a how-to guide for writing and publishing new documentation pages - Moved encrypted credentials into their own dedicated
secrets/folder, fully separated from anything the documentation site's build process can reach - Added an automated check that validates every documentation page before it's allowed to reach the site
- Found and fixed a gap where a failed notification to the site could go unnoticed — that check now fails loudly instead of silently succeeding
- The site now automatically pulls fresh documentation, hides unfinished (draft) pages, and only goes live if the site builds successfully — a broken docs change can never reach the live site
- Confirmed the entire publishing pipeline end-to-end: a documentation edit went from this repository to the live site automatically, with no manual steps in between
- This repository and the site repository were moved under the new
JaySync-LabGitHub organization, consolidating everything under one home
2026-07-02
- The
JaySync-LabGitHub organization was created to bring all lab-related repositories under one roof - A new
jaysync-lab-playgroundrepository was created as a sandbox for testing infrastructure changes safely before they touch production — see that repository's own implementation log for details
2026-06-19
- Added
CHANGELOG.mdto track all notable lab changes going forward - Added
infrastructure/proxmox-host.mddocumenting Proxmox node identity, software versions,vmbr0bridge config, storage pool definitions, and post-install configuration steps
2026-06-18
- Corrected SSD (Storage 1) capacity to 512GB in hardware specification
- Corrected storage pool capacities from live Proxmox data extraction
(
local~94GB,local-lvm~320GB,vault~916GB) - Updated all hardware and hypervisor documentation from a live Proxmox host extract (Proxmox VE 9.2.3, Kernel 7.0.6-2-pve, QEMU 11.0.0, LXC 7.0.0)
2026-04-16
- Added SOPS + Age encryption configuration and live end-to-end testing on the Proxmox node
- Documented Uptime Kuma (CT 101) observability container with custom HTML email alert template and status-page CSS
- Documented Tailscale bare-metal VPN setup and the MagicDNS conflict fix
(
--accept-dns=false+ hardcoded resolv.conf) - Documented Pi-hole (CT 100) DNS container: deployment, upstream resolvers, DHCP broadcast integration
- Documented BIOS pre-installation configuration (VT-x enabled, VT-d enabled, UEFI boot, ACPI power restore)
- Established repository folder structure:
/infrastructure,/networking,/services,/security,/templates - Added Uptime Kuma alert email template and status-page CSS theme to
/templates - Rebuilt repository with clean structure after removing initial scaffold
Earlier (reconstructed from initial commit — 2026-02-27)
- Initial repository created