Release notes
What’s new on Vidlet — new apps and updates, straight from what actually shipped; no synthesis.
This week
Jul 27
Recruiting Studio v59Update
Hotfix: tolerate a string-typed projects:index state value (capsule state can return JSON as text — the app already coerces objects via coerceObj, but the array readers didn't). New coerceArr used in /bootstrap, POST /projects (which would otherwise CLOBBER the index to a single entry), and /outreach/template. Direct-to-live: the client list was rendering empty.
Jul 27
Survey Studio v14Update
Reskin to Bento Design System defaults (bento-ds.com / buildo defaultTokens): brandPrimary violet #5C17E5 (hover interactive60 #360090, soft interactive05 #D0DCFF), textPrimary #1A212B / textSecondary #728197 on backgroundSecondary #F6F8FB canvas with white cards, outlineContainer/Decorative hairlines + visible outlineInput #9AA8BC input borders, Bento semantic sets (informative/positive/warning/negative bg+text tokens, #F2930D warning stars, #17BF33 positive tick), 8/16px radii + Bento elevation shadows, Lexend-first stack. Survey header (public + preview) back to the friendly solid-brand block with white text. Slider keeps the filled-track/white-thumb pattern recolored to brand violet with decorative track.
Jul 26
Recruiting Studio v58Update
Excel export for approved participants: toolbar button (visible on the Approved filter) fetches missing emails for ALL approved (8/batch, live progress + cost), then builds an .xlsx client-side (exceljs) matching the client's example format — bold header row: Email, First Name, Last Name, LinkedIn (link, hyperlinked), Job Title, Employer, State (if US), Country. Loading card with spinner during the run, then a download card (file icon, name, row count/size/lookup cost, Download button). New GET /export/approved returns export rows (profile-derived title/employer + US state/country parsed from location) + which recruits still need a lookup.
Jul 26
Recruiting Studio v57Update
Drafting UI removed (server drafting endpoints stay dormant): the selection action is now "Get emails" — it just resolves addresses. Bulk button looks up every selected person without an address (8/batch, live progress + real cost, previously-failed lookups skipped); every candidate card gets a "Get email" button (retries with force when a prior lookup found nothing) and shows the found address as a badge (or "no email found"). /candidates now hydrates contact so emails render in the list; /outreach/resolve returns slim per-recruit results and accepts force. Addresses persist to the global recruit panel via op_resolve_participant_contact as before.
Jul 26
Recruiting Studio v55Update
Logo: replace the plain violet square with a proper mark — Bento-violet rounded tile, white head-and-shoulders person, four-point sparkle in Bento tertiary #B3BEFF (echoes the ✦ AI affordance) — inline SVG in the sidebar brand and a matching data-URI SVG favicon.
Jul 26
Survey Studio v13Update
Reskin to Park UI (park-ui.com default theme: neutral accent + neutral gray, i.e. Radix gray scale): near-black #202020 solid buttons/selected states, white cards with gray.5 hairlines on gray.1 canvas, l1/l2/l3 radii (6/8/12) with full-round badges, Panda xs/md/lg shadows, Inter stack, grass/amber/red 9-11 semantic colors, amber #ffc53d stars. Park UI slider per docs: 8px rounded-full track with solid filled range (CSS --pct custom property, JS-updated on the public page), 20px white circular thumb with 2px accent border + xs shadow — applied to editor ghost, preview modal, and hosted public page. Public survey page header switched from solid accent block to Park white card.
Jul 26
Recruiting Studio v54Update
Fix textarea Shift+Tab with a bare caret (no selection): the line-wise branch sliced an empty segment (start==end) so outdent was a no-op — it now operates on the caret's whole current line.
Jul 25
Recruiting Studio v53Update
Bento DS restyle (bento-ds.com defaults): Lexend variable font (wght 400-600, ASCII+punctuation subset, 11KB) inlined as a data URI in src/fonts.css (external font hosts are CSP-blocked and the bundler has no woff2 loader); Bento neutral scale #F6F8FB/#DEE4ED/#728197/#1A212B, brand violet #5C17E5 (hover #360090), Bento semantic greens/ambers/negatives, 8px controls / 16px cards radii, soft shadows. Replaces the Fluent token theme.
Jul 25
Recruiting Studio v50Update
Outreach moves into the Candidates selection flow: bulk bar gains "Generate emails" for the selected people (OutreachPanel with template + AI draft + durable generate job + address lookup for the selection); Outreach tab/page removed; /outreach/generate + /outreach/resolve now take explicit recruit_ids, new /outreach/contacts read. Textareas get Tab/Shift+Tab indentation and Word-friendly paste normalization (CRLF, nbsp, bullet glyphs to markdown dashes). Cost display fixed to sub-cent precision — $0.005 no longer rounds up to $0.01 (client fmtUsd + server log fmt).
Jul 25
Survey Studio v12Update
Reskin to Thumbtack's Thumbprint design system (thumbprint.design tokens): blue #009fd9 accent (blue-500 hover, blue-100 soft), black #2f3033 / black-300 text, gray-200/300 surfaces + hairlines, token radii (xsmall 4 / small 6 / medium 8, sides 9999 for answer pills), shadow-100/300/400, Rise font stack at 14px app / 16px respondent page, yellow #febe14 stars, red/green/yellow 100+500 semantic pairs. Applied across app chrome, question editor, preview modal, hosted public survey page, and favicon.
Jul 25
Recruiting Studio v49Update
Move outreach generation into a durable server job (worker 'outreach'): /outreach/generate now snapshots the approved ids + template into a run record, kicks the job (batches of 20, per-batch idempotency keys, resume-safe) and returns job_id; new GET /outreach/status; client polls with batch progress. Fixes the sync_route_fanout finding for large approved sets. Removed the unused op_get_project_outreach permission.
Jul 24
Recruiting Studio v48Update
Outreach page: generate emails for all approved candidates — AI drafts a merge template (subject/body with {{first_name}}/{{company}}/{{title}} tokens) from the brief, op_add_outreach_draft renders+saves one per approved recruit (batched 50/call), results mirrored to app state (bodies aren't in the list read); address lookup for approved without email via op_resolve_participant_contact in 10-person batches with running cost shown. Permissions +op_add_outreach_draft +op_get_project_outreach. Full restyle: Fluent design tokens (Segoe UI stack, neutral #fafafa/#e0e0e0, brand blue #0f6cbd, 4px control radius) with Swiss restraint — flat cards, hairline borders, no gradients, subtle motion; violet accent retired.
Jul 24
Recruiting Studio v47Update
Search cost + 200-result cap: the worker budgets each query's Exa ask against RUN_RESULT_CAP=200 (stops the run when reached; panel resurfacing stays free/uncapped), accumulates the op's cost envelope into progress + per-query log lines; live banner shows results/cap and spend; completion persists a run_id-keyed per-search history (last 12) in project meta; /project returns it; Project page renders a Recent searches card (when · results · new · cost, ~ = estimated) and the find bar mentions the cap.
Jul 24
Survey Studio v11Update
Survey creation UX rebuild: type-mapped question editors (Google Forms-style option rows for choice modes with Enter-to-add/blur-to-remove, fixed Yes/No rows, star/NPS/slider/text ghost previews, per-type config fields) + custom answer-format picker with SVG icons replacing the bare select + full-screen interactive Survey Preview modal mirroring the hosted respondent page (wired into both the New Survey flow and the survey overlay editor) + option sanitization and needs-2-options guardrails on create/save.
Jul 24
Recruiting Studio v46Update
Planner prompt: reason-first (name the core subject, enumerate who actually does the work, write in their profile language) with calibrated anchoring — niche-equipment briefs tether peripheral titles to the trade/setting (fixes DMMV pulling HVAC/building managers), broad-role briefs keep clean persona+geo queries (preserves principals/counselors quality); portfolio of tight+broad queries; thinking+personas in output and logged; exclude cap 15; add POST /debug/plan preview route.
Jul 23
Recruiting Studio v45Update
Review fixes (frontend): C1 — scope pollStatus finally cleanup to the owning poll (no clobber of a newly-attached poll on project switch). C4 — loadMore offset derives from rows.length so it self-corrects after review drops rows. C5 — clear selection+comment on filter/origin change (no bulk verdict on off-screen rows). M1 — auto-focus 'New this search' via a searchDoneTick that fires only on genuine completion, not on stop/project-switch. C2 — show 'top N by fit' when the list is capped.
Jul 23
Recruiting Studio v44Update
Review fixes (server): C6 — classify HTTP 500 / internal_operation_error as infra-retryable (they're transient; were being silently dropped, losing queries). C2 — raise /candidates fetch cap to 5000 (page up to 60) so realistic projects sort+paginate over the full set (no unreachable tail, correct score order); add capped flag. C7 — fresh_count now reflects fresh rows within the active filter, not the global set.
Jul 22
Recruiting Studio v43Update
Live search chain-of-thought: worker appends a running log (planned N, 'Searching i/N: <query>', per-query 'X new / Y from panel / total', retry pauses, complete) to progress; /search/status already returns it. Banner renders the log + current query live; removed the Stop watching button.
Jul 22
Survey Studio v10Update
Redesign v1 (public survey page): match the app — kill every gradient (solid violet header + brand mark, solid accent submit button, solid green thank-you tick), single restrained violet accent (#5b45e0) on 1px hairline borders, crisp 8px radii on cards/inputs/answer controls, 6px chips (no 999px pills). Respondent-facing emoji-scale answer options are content and left intact.
Jul 22
Recruiting Studio v42Update
Per user: keep also_search_panel (resurface + filter). Remove the untriaged-count cap + query truncation in /search/start (it wrongly blocked resurfacing-heavy projects); run the full plan. Frontend: after a search completes, auto-focus the 'New this search' filter so the reviewer isn't buried under resurfaced panel members.
Jul 22
Recruiting Studio v41Update
Frontend for durable-job search: App uses a SINGLE status-poll loop (no step loop, no concurrent polling — item 3). Candidates: default to New (review queue) filter (item 7), origin filter fresh/panel (item 6), Exa rank + source_query badge (item 4), flag chips (item 5), fit-score band colors (item 9); reviewed rows leave a status-filtered view.
Jul 21
Recruiting Studio v40Update
Durable-job search (item 10): search runs entirely in workers.search with per-query infra/409 backoff (fixes retry storm 1); removed /search/step + /search/adopt; /search/start kicks startJob, client polls /search/status only (fixes concurrent loops 3). Worker captures find-only fields rank/source_query/origin into searchmeta. /candidates merges searchmeta + supports origin (fresh/panel) & status filters (items 4,6,7). Improved query-plan prompt (item 11).
Jul 21
Survey Studio v9Update
Redesign v1 (frontend): full-bleed shell, kill all gradients → single restrained violet accent (#5b45e0) on 1px hairline borders + minimal shadow, crisp 8px cards / 6px badges (no pills), remove all emoji from chrome (SVG gear + trash icons, text-only answer-mode dropdown), denser/tighter type scale, left-aligned Home header (no gradient hero), remove survey-card top stripes. Fold in the settings-overlay crop fix: drop animation-fill-mode `both` from .fade-in so the ProjectPage wrapper no longer establishes a containing block for the fixed overlay.
Jul 21
Recruiting Studio v39Update
Frontend: single serialized search driver with exponential backoff (no concurrent status poll); Candidates grid is lean + paginated (Load more) with on-demand profile hydration on expand and counts-only polling during search.
Jul 20
Recruiting Studio v38Update
Perf/OOM fixes: (1) /candidates is now lean + score-sorted + paginated (no profile hydration); add /candidates/count for polling and /candidate for on-demand single-recruit hydration. (2) /search/step separates infra 5xx (stop + backoff) from in-flight 409 (skip), removes retry-storm and dead code. (3) /search/start caps the untriaged backlog (800) and truncates queries to headroom. (4) add op_get_participant permission.
Earlier
Jul 20
Recruiting Studio v37Update
WAF probe: helper exercising generics, .test and a regex literal to learn the firewall ruleset before the real edits.
Jul 19
Survey Studio v8Update
Public page: CSP on the public host blocks fetch() — switch submission to a native form POST via hidden inputs (validation-gated, Enter-key guarded). Host thanks page confirms recording.
Jul 19
Recruiting Studio v36Update
CandidatesPage rebuilt: vertical full-detail cards (headline, meta, why-matched, full bio, complete experience/education/certificates with years and descriptions, no Show more), bulk + per-card review; createElement style.
Jul 19
Recruiting Studio v35Update
ProjectPage rebuilt: three markdown text fields (titles, questions, additional info) with explicit save keeping text as pasted; AI populate overrides them; createElement style.
Jul 18
Recruiting Studio v34Update
Add lightweight markdown renderer (createElement style, match-based parsing).
Jul 18
Recruiting Studio v33Update
Design refresh (retry after 502): typography, chevron dropdowns, markdown styles, vertical candidate card entry styles.
Jul 17
Survey Studio v7Update
Wire the full app in one atomic patch: ProjectPage workspace, real App shell (routing + bridge), full server (surveys CRUD + working-copy sync + styled public page + infer drafting + candidates).
Jul 17
Recruiting Studio v32Update
Candidate types gain education/certification description fields.
Jul 16
Recruiting Studio v31Update
Fields become raw text kept as pasted; AI populate joins to text and returns *_text; planner prompt rewritten for 10-15 facet-varied queries at 25 hits; education/certification descriptions included.
Jul 16
Recruiting Studio v28Update
probe edit 3 anchor only
Jul 16
Survey Studio v5Update
Phase 2d: add NewSurveyPage + SurveyOverlay (completes ProjectPage's imports).
Jul 15
Recruiting Studio v25Update
Additive: GET /project now also returns docText + lastPlan so Survey Studio's same-origin bridge can show the brief document and search plan (own UI unchanged — it ignores extra fields).
Jul 15
Recruiting Studio v24Update
search/step is now a reconcile pass over ALL unclaimed queries (cached claims instant, conflicts skip instead of blocking); orphaned reservations abandoned after 15 conflict-only attempts; client surfaces abandoned counts. (retry)
Jul 14
Recruiting Studio v23Update
Durable search: launch ALL queries in parallel inside /search/start (ops continue at the gateway after the route ends, so the run completes even with the tab closed); step loop becomes a claim/reconcile pass; retry cap raised to 60; button navigates immediately. (retry)
Jul 14
Survey Studio v3Update
Phase 2b: add HomePage, QuestionEditor, ProjectPage, NewSurveyPage, SurveyOverlay views (wired in next patch).
Jul 14
Recruiting Studio v22Update
Add zero-cost ping worker + /debug/ping to probe the job runner; step retries now cover generic refusal wrappers with an 8-attempt cap per query.
Jul 13
Recruiting Studio v21Update
search/step: on a write error, re-read progress first — a finished run reports done instead of surfacing a stray refusal. (retry after 502)
Jul 12
Recruiting Studio v20Update
Classify idempotency conflicts (already running for the supplied key) as retryable in both the step route and the client loop — they mean the query is still finishing, not a failure.
Jul 12
Recruiting Studio v19Update
Coerce string-stored search progress records via JSON.parse in status/step/adopt/start so externally-written state still resumes; next setProgress rewrites as an object. (retry 2 after platform 502)
Jul 12
Survey Studio v2Update
Phase 2a: add design system CSS, mode catalog, shared types/api helpers, HomePage, QuestionEditor.
Jul 11
Recruiting Studio v18Update
search/step: bridge timeouts and idempotency conflicts no longer kill the run — return retryable and let the client re-claim the committed result; client waits 8s on retryable steps.
Jul 11
Recruiting Studio v17Update
Treat took_too_long/timeout/5xx step responses as retryable (the query commits server-side; the retry claims the cached result); the status poller restarts the step loop if it is not running.
Jul 10
Recruiting Studio v16Update
Add /search/adopt route: when a background job dies mid-run, the client adopts the same run (same plan, same idempotency keys) and continues stepping automatically. (retry after platform 502)
Jul 9
Recruiting Studio v15Update
Hybrid search engine: /search/start plans + tries the background worker, falls back to client-stepped mode; /search/step runs one query exactly-once via deterministic idempotency keys; client resumes stepping after reload.
Jul 9
Recruiting Studio v14Update
Switch background search from the jobs step-API to the workers dialect this deployment wires (export const workers + startJob); deterministic per-query idempotency keys make re-driven runs spend-safe; pass run_id from /search/start.
Jul 8
Recruiting Studio v13Update
search/start: ignore a previous job that already failed/errored when deciding already_running.
Jul 8
Recruiting Studio v12Update
Move the whole search into a durable background job (plan + 4-8 queries as checkpointed steps, progress in state); routes /search/start + /search/status; client polls progress and resumes watching after reload; no 60s-driven limits.
Jul 7
Recruiting Studio v11Update
Default the client picker to the first existing client once projects load (was stuck on New client).
Jul 6
Recruiting Studio v10Update
Lazy-load mammoth/pdfjs inside extractText so nothing executes at mount (fixes first-paint crash); drop unused op_get_participant permission.
Jul 6
Recruiting Studio v9Update
Full redesign: left-nav light UI; Project page with client/project pickers, titles/questions/info fields, docx-pdf AI populate; silent AI query planning; one-query-per-request Exa search with background-completion polling (fixes took_too_long); rich candidate cards with bulk approve/maybe/reject; Communicate and Responses removed.
Jul 5
Recruiting Studio v8Update
Send one email per request (gateway replaces responses on refusal, so batch loops lose per-recipient outcomes); extract blocked-envelope error messages in the client api helper.
Jul 4
Recruiting Studio v7Update
Wire all four wireframe tabs (Criteria, Results, Communicate, Responses) into the App shell with project selector and cross-tab recipient handoff.
Jul 4
Recruiting Studio v6Update
Add CommunicatePage: recipients, subject/message with merge tokens, survey question builder, signature, save drafts and Gmail send with per-recipient outcomes.
Jul 3
Recruiting Studio v5Update
Add ResultsPage (lead review with star/select/resolve) and ResponsesPage (survey answers pivot table).
Jul 2
Recruiting Studio v4Update
Add CriteriaPage: project creation, source doc upload, AI criteria with editable rows, version approval, query planning and lead generation.
Jul 2
Recruiting Studio v3Update
Full server: projects, doc ingest, AI criteria + approval, Exa lead generation, participant status/resolve, surveys, outreach drafts + Gmail send, responses pivot, prefs, debug probe (fixed ||/?? parens).
Jul 1
Recruiting Studio v1New app
initial deploy