Changelog

What shipped, and when

LiveVault was rebuilt from scratch on 29 July 2026. The previous implementation was not under version control, so this log starts at the first commit of the rebuild rather than reconstructing dates that were never recorded.

  1. Renamed to LiveVault

    • The product is now called LiveVault. The name was changed everywhere in one pass: page copy, metadata, package names, the API service name, and the JWT issuer and audience claims.
    • The old wordmark could not come with it. The master logo artwork has the previous name baked into it as pixels, so the raster lockup was dropped and the wordmark is now set in type instead — same navy-and-blue colour split as the artwork, sharp at any size, and selectable text. The shield itself contains no text and was kept unchanged.
    • Token claims were rewritten while nothing is live. This invalidates any previously issued admin or stream token, which is the right time to do it: after launch the same change would sign everyone out.
  2. Contact form, and a demo that explains its own failures

    • The contact page now has a form: pick a topic, write the message, and it opens in your own email client fully composed. It deliberately does not post to a server — there is no mail-sending backend, and a form that accepts a message it cannot deliver is worse than no form. A copy-to-clipboard fallback covers browsers with no mail client registered.
    • The demo now names the actual reason it cannot start. A missing API address, an out-of-date API with no demo route, a database that is down, and a server that never answered used to look identical; each now gets its own explanation plus the raw technical line.
    • Fixed a real deployment trap: with no API address configured at build time, the site quietly fell back to calling localhost, which fails as mixed content on an HTTPS page and reported itself as a connection problem. It now says plainly that the address was never configured.
    • Network errors name the host that was tried, which separates a wrong address from a sleeping server from a CORS rejection.
  3. 3D vault fixed, and another pass of polish

    • Fixed the 3D vault: its resting tilt was being silently discarded, because a CSS animation on a transform replaces the whole property and the tilt shared an element with the spin. The top face was never visible. The two are now on separate layers.
    • The vault also sits properly on desktop now — nudged left of centre and lifted above the card rather than hanging off the right edge.
    • Added a scroll position indicator across the top of the page, driven by CSS scroll-linked animation with no scroll listener and nothing to hydrate.
    • Card hover shadows are tinted with the brand blue instead of grey. On a near-white page a grey shadow reads as dirt; a blue one reads as light.
    • Added a trace of film grain behind the hero sections, because wide areas of near-white look flat on a good display.
    • The about page is properly responsive at every width, and now shows the contact address rather than only linking away to it.
  4. Light theme, official logo, and a 3D motion system

    • The whole site moved from a dark theme to a light one, rebuilt on the brand palette: #0053FF for actions and links, #1A7CF1 for hover states, #62EAFF as a decorative accent, and #2C4267 for body text. Cyan is used for decoration only — it sits at roughly 1.4:1 on white, so it never carries text.
    • The official LiveVault logo replaced the placeholder inline SVG. Three optimised assets are generated from the master artwork by a build script: a 512px transparent shield, a trimmed 960px lockup, and a 64px favicon. The 2.2 MB source file is not shipped to the browser.
    • The tagline on the site is now the one on the logo itself — Secure. Tokenized. Temporary.
    • New motion system: scroll-linked section reveals, pointer-tracked 3D tilt cards with a specular sheen, a CSS-only rotating vault cube, drifting aurora fields, and masked dot grids.
    • All of it degrades safely. The reveal animations are wrapped in a feature query, so browsers without scroll-driven animation support get the content plainly visible rather than blank, and everything is disabled under prefers-reduced-motion.
    • Open Graph cards redrawn in the brand palette instead of the old dark card.
  5. Pricing in rupees and a named founder

    • Pricing is quoted in INR: Free at ₹0, Pro at ₹999 a month, Team at ₹2,999 a month. Pro and Team are labelled as planned, because neither is purchasable yet.
    • The about page names the founder, Saifullah Faizan, and states plainly that LiveVault is solo-built, pre-launch, and unfunded.
    • Contact is a single email address, owner@livevault.live. There is no contact form and no phone number — a form that silently fails is worse than no form.
  6. Marketing site, public demo, viewer, and admin panel

    • New server-rendered Next.js frontend. Every public page returns real HTML on first load, replacing the previous single-page app that served an empty shell.
    • Public demo at /demo: upload an image, get a tokenized link, watch it expire after one view or fifteen minutes. No account needed.
    • Secure viewer at /v/<token> with sequential reveal, per-asset countdown, and session lock states.
    • Admin panel at /admin: upload media, create links with view limits and deadlines, monitor link status, destroy links early, and approve pending admin accounts.
    • Per-page meta descriptions, Open Graph and Twitter card tags, robots.txt, and sitemap.xml.
  7. Media storage moved off the container filesystem

    • Uploads now go to a private Cloudflare R2 bucket over the S3 API. The previous build wrote to local disk on Render, where the filesystem is ephemeral — every deploy or restart silently destroyed the media while the link records survived, so links looked valid and then failed.
    • Media is streamed through the API behind a short-lived, session-bound ticket rather than a shareable presigned URL. HTTP range requests pass through so video seeking works.
    • A cleanup worker deletes objects from storage before dropping the link record, and retries rather than orphaning bytes if a delete fails.
  8. Real time-based link expiry

    • Links now carry an absolute expiresAt deadline, enforced on every read path independently of the view counter. The previous schema had no deadline at all: an active link that was never opened stayed viewable indefinitely.
    • Separate purgeAt field controls when the underlying media is deleted, so expiry and deletion are no longer conflated.
    • Opening a link on a phone is refused and recorded instead of expiring the link. This removed the replacement-link mechanism the old build needed to undo its own penalty.
  9. Security hardening in the rebuilt API

    • Configuration is validated at boot and the server refuses to start on a missing, too-short, or placeholder secret. The previous build defaulted its JWT and stream-token secrets to change-me, so a misconfigured deploy came up healthy while signing forgeable tokens.
    • CORS is an exact-origin allowlist. The previous check accepted any bare public IPv4 address because its LAN-address pattern had no private-range restriction.
    • Rate limiting added across authentication, token validation, viewer traffic, and demo uploads. There was previously none.
    • Demo uploads are restricted to images by inspecting magic bytes rather than trusting the client's declared content type.
    • Share tokens carry 256 bits of entropy and are stored only as SHA-256 digests.