Commit Graph
6318 Commits
Author SHA1 Message Date
Amruth Pillai 99ff19e4e8 feat(templates): add Porygon and Smeargle templates
Porygon lays the resume out as a ruled form after the Japanese résumé
form (rirekisho). The header is a block of bordered field cells framed
in the accent color with the photo in a cell of its own, and every
section is a table with a solid title bar over one ruled cell per
entry. Touching cells share one tinted rule.

Smeargle sets the resume like a magazine feature: the headline as an
uppercase kicker over a display name, the summary as an italic
standfirst, and italic section headings at the user's heading size.

Both are one-column and ATS-safe. Register them in the schema, renderer,
semantic manifests and gallery, add gallery and docs previews, extract
the new descriptions, regenerate the API spec, and list them wherever
the docs enumerate templates.
2026-10-02 01:18:59 +02:00
Amruth Pillai 581dafdfd9 fix(pdf): paint background, border and padding on block text
Forme's Text draws no background, border or padding of its own. A block
text carrying any of them is now wrapped in a box that paints them, the
way texts inside rows already were.

Section headings rendered as filled bars or underlined titles vanished
whenever section icons were hidden (Kakuna, Meowth, Rhyhorn, Chikorita,
Leafish, Gengar, Ditgar, Glalie and Pikachu lost their heading rules), and
text-only contact links lost their box styles. The 1pt gap between a
section icon and its title, already requested by the shared heading code,
now takes effect too.
2026-10-02 01:18:16 +02:00
Amruth Pillai 0a0970160b fix(settings): show application names and separate scrolling 2026-10-02 00:29:29 +02:00
Amruth Pillai 78f4f81831 fix(mcp): complete API parity and harden authentication and transport 2026-10-02 00:16:34 +02:00
Amruth Pillai 57171c6fcb feat(api): add REST endpoints for imports, exports, checks and pagination
Resource-oriented REST aliases cover file imports (PDF text layer, JSON
Resume, Reactive Resume v4/current, LinkedIn), PDF/DOCX/Markdown/JSON
exports for resumes and cover letters, editor content checks, job-term
matching and a public PDF readability checker. Collection endpoints accept
limit/offset with X-Total-Count headers, and PATCH routes cover partial
updates. Existing routes and response shapes stay unchanged.

The OpenAPI spec marks public operations with `security: []`, the REST
surface gets a 40 MiB body limit, and Better Auth publishes its own
OpenAPI schema. Cookie sessions are rejected for cross-origin requests.
DOCX export parses HTML with node-html-parser so it runs on the server,
and PDF line extraction moves to @reactive-resume/import for reuse.
2026-10-01 23:01:11 +02:00
Amruth Pillai 8320f9ea27 docs(changelog): embed the v6 video 2026-10-01 23:00:53 +02:00
Amruth Pillai 36f2477c2a build(web): use Lingui's native macro transform instead of Babel
The Lingui Vite plugin transforms macros itself, so the Babel preset and
its plugin dependency go. TanStack Router's split-route query hides the
`.tsx` extension, so the parser is told to read TSX explicitly.
2026-10-01 23:00:52 +02:00
Amruth Pillai b63170c5f1 fix(web): let Escape reach both the command palette and the editor 2026-10-01 23:00:51 +02:00
Amruth Pillai 87b5d695a4 fix(pdf): wrap glalie contact text and center section heading icons
Glalie's contact box let long emails and links run past its border: the
converter dropped a link's lone text into a shared inline run, losing its
box styles, so Forme sized it to its full width. A lone text now converts
as its own block, and Glalie's contact text takes the rest of the row so
Forme wraps it inside the box.

Section heading icons sat at the top of the title's line box, above the
text. The icon now moves down by half the leftover line height and never
exceeds the line, so it stays level with the title in every template.
2026-10-01 23:00:42 +02:00
Amruth Pillai 8ab54c8ad0 chore: remove outdated design and redesign plan documents, update package dependencies 2026-10-01 21:49:47 +02:00
Amruth Pillai da65fbef12 fix(web): refine document library usability 2026-10-01 21:49:20 +02:00
Amruth Pillai 0ac6f81bf2 fix: use monospace typography for landing page receipt 2026-10-01 11:19:01 +02:00
Amruth Pillai 1459259dd0 docs: update v6 changelog with latest changes 2026-10-01 07:46:37 +02:00
Amruth Pillai d9c121daaa fix(web): improve landing page motion and feedback 2026-10-01 07:36:40 +02:00
Amruth Pillai bc92b8cf7f fix: finalize v6 migrations and document workflows 2026-10-01 07:06:15 +02:00
Amruth Pillai 8105889b0c style(web): align AI provider and web access headers 2026-10-01 04:25:17 +02:00
Amruth Pillai 5d540f75d6 feat(web): refine integrations and suggest AI models 2026-10-01 04:11:49 +02:00
Amruth Pillai 3e14ecaab8 chore: update dependencies 2026-10-01 03:07:07 +02:00
Amruth Pillai fcfb18fe5a chore: migrate linting and formatting to Oxc 2026-09-30 22:53:16 +02:00
Amruth Pillai 3e7849e51f feat: save jobs and prepare applications
Keep manual preparation available without provider credentials.
Share bounded search and reading across Applications and the assistant
with one selected Firecrawl, Tavily, or Exa connection.

Backfill encrypted Firecrawl credentials without decrypting or removing
legacy rows. Add nullable posting-source metadata to applications.
2026-09-30 22:43:45 +02:00
Amruth Pillai 0bdf8066cd fix: make monorepo checks and caching consistent 2026-09-30 22:32:05 +02:00
Amruth Pillai bec152b7e9 feat: add shared AI and Firecrawl job search integrations
Add managed credentials, job posting search and scraping, database migration, translations, and self-hosting documentation. Fix empty resume-copy recovery and ensure every sheet popup renders inside a drawer viewport.
2026-09-30 21:00:43 +02:00
Amruth Pillai ec0932c5d2 fix(ui): unify fonts and prevent footer text clipping 2026-09-30 15:11:56 +02:00
Amruth Pillai 51faba9e9d docs(DESIGN.md): refine interface description and update typography, color, etc 2026-09-30 09:57:35 +02:00
Amruth Pillai e67b1c7ae9 docs(changelog): update title and description for clarity 2026-09-30 07:22:09 +02:00
Amruth Pillai b87b31f7e9 docs(changelog): add release notes for v6.0.0 with breaking changes and new features 2026-09-30 07:12:21 +02:00
179861e39e fix(dsh-plugin): support DSH 0.2 host versions (#3552)
* fix(dsh-plugin): accept the DSH 0.2 host line in peer ranges

The Harness peer ranges pinned `^0.1.0-rc.6`, which the 0.2.0-rc.2 host
rejects, so a profile on the new core refused to load the plugin:

  Plugin dsh-plugin-reactive-resume@0.1.0 is incompatible with dsh 0.2.0-rc.2

The host decides that with
`semver.satisfies(runtime, range, { includePrerelease: true })`. Under that
mode the upper bound is what fails: `^0.1.0-rc.6` expands to
`>=0.1.0-rc.6 <0.2.0-0`, and `0.2.0-rc.2` sorts above `0.2.0-0` because the
numeric identifier `0` precedes `rc`.

npm's default mode, which the plugin market's checker uses, is stricter: a
prerelease only satisfies a comparator set that pins the same
major.minor.patch tuple with a prerelease of its own. There the bare
`^0.1.0-rc.6` admits only `0.1.0-rc.6` through `0.1.0-rc.8`;
`>=0.1.0-rc.6 <0.3.0-0` still admits only those three, and `*` admits none of
the 29 published releases. An explicit union is the only form both modes
accept, so the MCP bridge peer and the prompt peer both become
`^0.1.0-rc.6 || ^0.2.0-rc.1`.

The union is additive: everything the old range admitted is still admitted.
`devDependencies` move to `^0.2.0-rc.2` so the package develops against the
core it now claims.

No source change was needed. `dsh-mcp-client@0.2.0-rc.2` keeps its `Config`
union, its `apply(ctx, config)` signature, and the
`mcp__<serverName>__<rawName>` public tool name, while
`dsh-system-prompt@0.2.0-rc.2` keeps `section({ name, order, text })`. The
0.2 additions to the bridge — MCP resource publishing and a
server-instructions prompt section — are additive and scoped to
`ctx.inject(["mcpResources"])` and `ctx.inject(["systemPrompt"])`, neither of
which this package depends on.

The README records the two comparison modes, since the prerelease rule makes
the obvious alternatives silently wrong.

* fix(dsh-plugin): refresh DSH 0.2 lockfile

---------

Co-authored-by: ddddd-ren <ddddd-ren@users.noreply.github.com>
Co-authored-by: Amruth Pillai <im.amruth@gmail.com>
2026-09-30 06:46:49 +02:00
Amruth Pillai 50af92e2fc fix: drain server requests and update deployment smoke 2026-09-30 06:21:46 +02:00
Amruth Pillai 9a803305c8 fix: address verified v6 app findings
Fix authentication recovery, account imports, application tracking, resume
editing and exports, sharing, API contracts, provider selection, and private
local attachments. Preserve authored content during PDF pagination.

Update guides, generated OpenAPI output, and translation catalogs to match
verified behavior and documented constraints.

Validation: 1,019 tests passed; 12 database/OAuth integration tests skipped.
Ten affected package typechecks, production build, Biome, and package
boundaries passed.
2026-09-30 06:15:09 +02:00
Amruth Pillai d6f03a3e67 fix(web): stop the landing design scene flickering on android chromium
Every scrolled frame repainted the whole sticky stage: the fading title, contact sheet, labels and caption painted into it, and the template wipe animated clip-path over full pages. Android Chromium could not raster that during a fling and showed blank tiles.

Give each scroll-driven element its own layer, fade the contact sheet once instead of per thumbnail, and wipe by sliding clipped layers and moving the divider with a transform. Raster work across the scene drops about sevenfold in an emulated Pixel 7 trace.
2026-09-30 06:07:16 +02:00
Amruth Pillai d46b4b5815 docs: rewrite the documentation for v6
Rewrite every guide for the redesigned app, add guides for new features (documents, editor modes, check, cover letters, assistant, applications, self-hosting upgrade and environment reference), remove v5-only pages with redirects, and replace every screenshot.
2026-09-30 05:07:06 +02:00
Amruth Pillai 883045b14c fix(tooling): mark generated doc blocks with mdx comments
Mintlify's MDX parser rejects HTML comments, so the JSON schema guide failed mint validate.
2026-09-30 05:07:05 +02:00
Amruth Pillai 31c58baed4 feat(applications): enhance application stage tracking and improve form handling 2026-09-30 01:27:21 +02:00
Amruth Pillai 36ba314e2a chore(deps): update @dotenvx/dotenvx to version 2.32.1 and @babel/core to version 7.29.7 2026-09-30 01:14:44 +02:00
Amruth Pillai 49fcc630d1 fix(web): refresh the PWA screenshots and ship them to Vercel
The unanchored screenshots pattern in .vercelignore also matched
apps/web/public/screenshots, so the manifest's screenshots 404ed on Vercel.
Anchor it to the root and replace the screenshots with the redesigned app.
2026-09-30 01:12:40 +02:00
Amruth Pillai 1e8b638a6c fix(pdf): keep the timeline dot round when an item breaks across pages
Forme 0.25 stretches the last box of a splitting column down to the page's
end, so Azurill's timeline dot grew into a pill. A plain box around the dot
now takes the stretch.
2026-09-30 01:12:39 +02:00
Amruth Pillai d3ed651d65 feat(web): suggest traditional resume fonts and link to custom fonts
Replace the Type presets with five traditional resume faces: EB Garamond,
Tinos, Source Serif 4 with Source Sans 3, Carlito and Lato. Presets now set
body text in Regular and Bold (400/700), which every one of them ships.

Add a Custom row under the presets. It shows the resume's own fonts when they
match no preset, and opens Advanced (even when collapsed) at the Typography
editor, focusing the body font picker. On phones it switches the Design sheet
to the Page tab first.

The mobile editor body now clips instead of hiding overflow, so scrolling
inside the lowered Design sheet can no longer shift the sheet itself.
2026-09-30 01:09:31 +02:00
Amruth Pillai 6d4ceefbdf fix(pdf): honor soft hyphens for every hyphenated language
Forme hyphenates every language it has patterns for, so drop the German-only
gate on soft-hyphen decoding and the "Currently supports German" schema note.
2026-09-30 01:07:33 +02:00
Amruth Pillai 725be158c0 feat(deploy): deploy Vercel as frontend and backend services
Vercel now deploys Reactive Resume as two services in one project:
`frontend` serves the static Vite build from apps/web/dist, and
`backend` runs the Hono server Function from apps/server. Top-level
rewrites send server-owned paths (/api, /uploads, /mcp, /.well-known,
robots.txt, sitemap.xml, llms.txt, schema.json, index.html) and every
path without a file extension to `backend`, so HTML shells keep their
injected SEO metadata. Paths with a file extension go to `frontend`.

The service builder needs a few accommodations:

- apps/server/vercel.mjs replaces api/index.mjs as the entrypoint,
  because a service entrypoint must exist before the build runs.
- `outputDirectory: "."` stops the builder from using the Docker
  entrypoint in dist/ as the Function handler.
- The builder loads external CommonJS dependencies through pnpm links
  that it leaves out of the Function. ioredis and react-reconciler are
  now bundled with their dependencies, and bcrypt is replaced with
  bcryptjs, which reads and writes the same $2b$ hashes.

The Vercel compatibility workflow now builds with the services
framework and loads a copy of the backend Function outside the
checkout, so a dependency missing from the Function fails CI. The stale
PDFKit trace checks are removed.

Existing Vercel installations must set Framework Preset to Services
before redeploying; the self-hosting guide documents this.
2026-09-30 00:17:24 +02:00
Amruth Pillai d4265e76e0 docs: add clarification on Turborepo configuration and task behavior 2026-09-30 00:16:59 +02:00
Amruth Pillai f8981502f1 feat(web): add an FAQ to the landing page and tighten SEO for answer engines
- Add a Questions section to the homepage: eight answers as folded paper
  notes that unfold from their crease, with a pencil circle and underline
  drawn on open, a new doodle, and FAQPage structured data rendered from
  the same localized answers.
- Prerender /ats-checker per locale alongside the homepage
  (dist-prerender/<page>/<locale>.html) and add a "What it checks"
  section; PDF.js and the importers now load only once a file is chosen.
- Make the server the single owner of SEO head tags: canonical, hreflang,
  social cards with og:locale and the page's localized title, and JSON-LD
  with an Organization entity. The router now sets only the title,
  description and robots tags, so nothing is duplicated after startup and
  the ATS checker keeps its structured data.
- Add hreflang alternates to the sitemap, expand llms.txt, and delete the
  stale v5 robots.txt and sitemap.xml from public/.
- Draw decorative heading and typed-text layers as generated content, so
  page text holds each heading once.
2026-09-30 00:16:40 +02:00
Amruth Pillai 8ded9de46e chore: update versioning and dependencies, remove unused configuration files 2026-09-29 23:34:31 +02:00
Amruth Pillai f82e9f33f3 fix(web): use the brand icon in the app sidebar and rail
The sidebar and the collapsed rail drew a placeholder "Rr" tile; they now
show the real logomark.
2026-09-29 23:25:15 +02:00
Amruth Pillai 5b84bf800a feat(web): trim the editor bar and mark a public resume on Share
Undo leaves the desktop editor bar (it stays on ⌘Z), leaving history,
the assistant, Share and Download. A public resume now shows a "Public"
badge on the Share button instead of an unlabelled dot, and the button's
accessible name says so. The first page caption drops "· click any line to
edit it" and its reserved height.
2026-09-29 23:25:13 +02:00
Amruth Pillai 01e87a6f1b feat(web): show resume details in the document menu and ask for donations after a download
The document menu's Information item opened a donation appeal and a row of
project links, which isn't what anyone expects from a resume's menu. It's now
Details: when the resume was created and last edited, its template, language
and page count, and whether it's private or shared (with its link). The
resume API returns `createdAt` for this.

The donation ask moves to the moment someone has what they came for: after a
successful download in Share & export (resumes and cover letters), one quiet
line wishes them luck and links to Open Collective. The old dialog's links
(docs, source, translations, bug reports, donate) live in the Settings
sidebar footer.
2026-09-29 23:24:15 +02:00
Amruth Pillai 48b27802fd test: remove redundant cases and repeated setup 2026-09-29 23:17:30 +02:00
Amruth Pillai 6cfcdea327 docs: update repository agent instructions 2026-09-29 23:04:22 +02:00
Amruth Pillai b399e289d6 feat(web): redesign the landing page as one scroll-driven story
"Everything you've done, on one page." A single resume page is assembled,
written, restyled, checked, tailored and shared as the visitor scrolls,
followed by live community numbers, languages, a support receipt, a
closing call to action and the footer. It replaces the previous homepage
and its playgrounds.

Motion: a small scroll engine (features/homepage/scroll.ts) writes each
section's progress as --p on every animation frame, and the scenes derive
their motion from it with CSS calc(). React only re-renders on coarse
steps held in a zustand store. Reduced motion collapses every pinned
scene to one screen at its end state and stops all ambient motion.

Server-rendered copy: the web build now prerenders the homepage once per
locale (Vite app builder, features/homepage/prerender.tsx) into
apps/web/dist-prerender, which the server sends for "/" by `?locale=`,
then the saved locale cookie. main.tsx waits for the route to load before
React replaces the prerendered page, so it never flashes a loading screen.
dist-prerender is added to turbo outputs, the Docker image and the Vercel
function files.

SEO: localized title and description, a canonical per locale, hreflang
alternates for every locale over `/?locale=` addresses (the app now reads
that parameter), and SoftwareApplication JSON-LD. The FAQ structured data
is dropped because the page shows no FAQ.

Also: self-hosted Anybody and Martian Mono (landing only) and Newsreader
italic, graphite doodles as WebP, new Material Symbols in the icon subset,
the pull-cord theme switch on the app's theme cookie, and new catalog
strings extracted for translation.
2026-09-29 22:34:16 +02:00
Amruth Pillai 708a956174 fix(ui): show the focus ring on segmented control items
`outline-none` on the item beat the base-layer `:focus-visible` ring and
nothing replaced it, so keyboard focus was invisible. Dropping it lets the
design system's 2px accent ring show again.
2026-09-29 22:34:00 +02:00
Amruth Pillai 8a2fa26451 ci: run the database-backed suites and drop coverage from the unit step
The cover-letter and MCP OAuth flow suites were gated on environment variables
CI never set, so they never ran. Point them at the job's PostgreSQL. The
cover-letter suite works in its own schema; the OAuth suite gets a database of
its own because it writes signing keys under its own secret, which the e2e
server can't decrypt.

Nothing reads the unit step's coverage report, so test:ci no longer collects it.
2026-09-29 22:31:56 +02:00