Commit Graph
10 Commits
  • Build the image on PRs so it is verified before merge
    The publish workflow only fired on push to main and on v* tags, which
    meant the Dockerfile got no CI coverage at all until after it landed —
    and the workflow could not be observed working before merging it.
    
    PRs now run the same build with push disabled, amd64 only (the emulated
    arm64 leg is the slow part and is not needed to prove the build works).
    Login, SBOM, provenance and attestation are skipped when not publishing.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
  • Redesign the landing page around a print-forensics palette
    The old page was the default dark-SaaS template: near-black ground,
    violet gradient headline, blur-glow orbs, glassmorphic rounded cards,
    emoji icons. It looked like every other generated landing page and said
    nothing about what the product is for.
    
    This one is built out of document materials, because the product is
    about documents:
    
    - Warm newsprint stock (#f2efe6) and warm near-black ink instead of
      near-black and violet. Two accents only, each with a job: vermilion is
      reserved exclusively for content that was hiding, olive for content
      that has been cleared. Nothing else gets to be colored.
    - Instrument Serif carries the headlines, Geist Mono carries labels and
      metadata, so the UI sans never has to pretend to be expressive.
    - Hairline rules do the structural work that bordered cards were doing.
      The six hiding places are now a numbered editorial list rather than a
      grid of identical rounded boxes, and the pipeline steps are a ruled
      table with serif numerals.
    - Left-aligned asymmetric hero with a colophon block, rather than
      everything stacked down the center axis.
    - The self-host section inverts to ink for tonal contrast, which also
      gives the terminal block somewhere natural to live.
    
    The page also now practices what it preaches: there is a real
    white-on-white sentence planted in the hero, and an X-ray switch in the
    nav reveals it. Selecting it works too, the same way it would in a PDF
    viewer.
    
    The four-stage demo keeps its behavior and moves to the new palette.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
  • Make the container actually deployable, publish to GHCR
    The Docker setup built but never came up. Three separate blockers, each
    found by running the full compose stack against a real Postgres:
    
    - The runner stage hand-copied prisma/@prisma/dotenv, which misses the
      CLI's transitive deps (valibot) and crash-looped the entrypoint. A
      dedicated migrator stage now installs the CLI at the exact lockfile
      version with its real dependency tree.
    - Docker sets HOSTNAME to the container id and Next's standalone server
      binds to it verbatim, so the app was unreachable on localhost inside
      the container and the healthcheck could never pass. Pinned to 0.0.0.0.
    - openssl was missing from the build stages but present at runtime, so
      Prisma detected a different platform and tried to download a matching
      query engine at boot, as an unprivileged user, into a root-owned
      directory. Aligned openssl across every stage that touches Prisma.
    
    Verified from a clean volume: migrations apply, both containers report
    healthy, /api/health returns 200, and the app serves from the image.
    
    Also:
    - Publish multi-arch images to GHCR on push to main and on v* tags, with
      an SBOM and a signed provenance attestation.
    - Default compose to the published image; add a build override for
      working on the app itself. Host port and image are configurable.
    - Drop two unused dependencies: canvas (19MB of native node-canvas; the
      pipeline uses @napi-rs/canvas) and multer (routes use formData()).
    - Add a root .gitignore. There wasn't one, so a real .env was one
      `git add .` away from being committed. Untrack .DS_Store.
    - Rewrite the README around what the tool does and how to run it.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
  • MVP
    Next step
    1) Make a Demo video
    2) Deploy
  • Revise demo image and installation instructions
    Updated demo image link and repository clone instructions.
  • Add XRayPDF client app with OCR routes
    Introduce a new Next.js `client` app for XRayPDF: adds frontend pages (dashboard, upload, layout, Navbar, globals) and API routes for documents (upload, OCR, pixel processing, delete, list). Include Tesseract traineddata (eng.traineddata), update next.config.ts to allow native server packages and remote images, update package.json to add dependencies (canvas, sharp, tesseract.js, pdfjs-dist, multer, uuid), and update Prisma schema. Also add .gitignore entries for user uploads/results and a README describing the project and architecture.
  • Add Next.js client app with Prisma and auth
    Introduce a new 'client' Next.js app scaffold: configuration files (next.config.ts, eslint.config.mjs, postcss, tsconfig), Prisma config and schema, app routes including NextAuth API and server actions, session/provider utilities, proxy, public assets, README and .gitignore. Also add IDE project files under .idea and a root README to initialize the repository structure for development.