Files
Reactive-Resume/docs/guides/creating-your-first-resume.mdx
Amruth Pillai 6d8d8f6e55 feat: add AI agent workspace (#3062)
* chore(ai): remove local AI store now that providers live server-side

The Zustand-based useAIStore has been replaced by the server-side
aiProviders oRPC router (encrypted credentials persisted in DB).
Delete the dead store + tests, drop the ./store export, and remove
zustand/immer deps which are no longer referenced anywhere in
packages/ai/src/.

* feat(agent): archive/delete actions and read-only state for agent threads

- Backend: mark archived threads as read-only in threads.get and reject
  messages.send with CONFLICT when the thread is archived.
- Frontend: render archived threads in the sidebar with muted styling and
  an Archived badge; add a per-thread dropdown menu in the chat header
  with Archive (non-destructive) and Delete (with confirmation); show a
  read-only banner above the message list that disambiguates archived
  vs. missing-resource causes; suppress the Retry and Stop buttons in
  read-only mode.
- Tests: new packages/api/src/services/agent.test.ts covering the
  archived-thread isReadOnly flag and the archived-thread send refusal.

* fix(agent): abort run on archive and verify ownership before deleting thread

- threads.archive: before flipping status, abort any in-flight run controller
  and clear the active-run state on the thread; cleanup failures are logged
  but do not block the status update.
- threads.delete: assert thread ownership via getThread before destructive
  work so an authenticated user cannot wipe another user's attachment rows
  by passing a foreign threadId.

Adds focused tests for both behaviors.

* feat(agent): display patch diffs and surface revert conflicts

Render apply_resume_patch tool messages with a status-aware card (applied/
reverted/conflicted), expandable operation list, and a Revert button that
correctly handles RESUME_VERSION_CONFLICT responses. Adds unit tests for
the inverse-patch builder and the agentService.actions.revert flow.

* chore(agent): remove out-of-scope attachment tests accidentally added in Task 6

The Task 6 commit (73ef1acca) accidentally re-introduced three attachment-
related tests that belong to a separate task:

- `buildAttachmentModelParts > converts text, image, supported binary, and
  unsupported attachments into model parts`
- `agentService.messages.send > persists the user message with file UI parts
  and links selected attachments to it` (was failing — the `ToolLoopAgent`
  mock is not callable as a constructor)
- `agentService.messages.send > rejects attachments that are missing, foreign,
  or already linked before persisting a message`

These were likely re-added during a stash recovery and were not requested
for Task 6, whose scope was limited to the `agentService.actions.revert`
flow. Remove them along with the helpers/fixtures (`buildAttachment`,
`buildActiveThread`, `selectWhereResult`, `selectOrderByResult`) that they
were the only consumers of. `selectLimitResult` is preserved because it is
used by the revert tests.

* chore(agent): configure runtime dependencies

* feat(db): add agent workspace schema

* feat(api): add agent backend services

* feat(web): add agent workspace UI

* chore(agent): remove legacy builder assistant

* test(agent): make agent stream mocks constructible

* chore(web): remove unused resume replacement hook

* feat(api): add unsafe AI base URL flag

* chore(dev): expose local services in compose

* fix(web): normalize resume preview gaps

* feat(api): improve agent tool handling

* feat(web): polish agent workspace UI

* chore: update dependencies

* fix(api,web): address PR review feedback for agent workspace

Security/correctness:
- Restrict AI provider URLs to http/https even in unsafe mode
- Stop exposing Redis on host network by default
- Make .env.local optional and drop app profile in compose.dev.yml
- Store agent attachments with private ACL on S3
- Reset provider test status when provider/model/baseURL changes
- Decouple non-agent AI endpoints from REDIS_URL requirement
- Fix JSON Patch add inverse for existing object members
- Wrap resume patch + agent action insert in db transaction
- Validate partialMessage at runtime and rate-limit attachment uploads
- Add unique index on agent_messages (thread_id, sequence)

UX/bugs:
- Mark agent thread route as ssr: false and guard SSE chunk parsing
- Show config-specific banner only on known configuration error
- Gate AI provider checks behind loading state in resume import
- Fix relative-time formatter blank gap between 45-59 seconds
- Clarify thread delete confirmation message

Polish:
- Raise ENCRYPTION_SECRET minimum to 32 characters
- Bucket AI rate limits by resumeId/threadId/messageId
- Trim form values before submitting AI provider config
- Use single key identifier and nullish-coalesce baseURL display

* fix: address ai agent review feedback

* fix: preserve mobile agent chat state

* docs: add ai agent workspace guides

* feat: introduce design system for Reactive Resume
2026-05-14 15:00:04 +02:00

86 lines
3.0 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Creating your first resume"
description: "Learn how to create your first resume in Reactive Resume, set a name and slug, and open it in the builder."
---
<Steps>
<Step title="Log in to your account">
Head over to [https://rxresu.me](https://rxresu.me) and log in with your account credentials.
<Tip>
If you haven't created an account yet, follow the guide on [Creating an Account](/guides/creating-an-account).
</Tip>
</Step>
<Step title="Open the Resumes Dashboard">
After logging in, navigate to your Dashboard where all of your resumes live.
<Info>
This is where you can create, import, organize, and manage multiple resumes for different roles or versions.
</Info>
</Step>
<Step title="Click “Create a new resume”">
In the Resumes Dashboard, click on the <Badge>Create a new resume</Badge> card to open the creation form.
<Frame caption="Create a new resume dialog">
<img
src="/images/guides/creating-your-first-resume/screenshot-1.webp"
alt="Create a new resume dialog with name, slug, and tags fields"
/>
</Frame>
</Step>
<Step title="Name your resume">
Fill in the resume name. This can be a generic name (e.g., “General Resume”) or something tied to the position youre applying for.
<Tip>
If you cant think of a name yet, click the magic wand button to generate a random name for you.
</Tip>
</Step>
<Step title="Review (or edit) the slug">
The <Badge>Slug</Badge> field is auto-filled based on the name, but you can change it to anything you like.
<Warning>
If you choose to publicly share your resume, it will be accessible at `https://rxresu.me/{username}/{slug}`.
</Warning>
</Step>
<Step title="Add tags (optional)">
Add any <Badge>Tags</Badge> you want. Think of tags like folders or labels to help organize many resumes.
<Info>
You can filter resumes by tags later from the Dashboard. The tag filter appears after you have at least one tag.
</Info>
</Step>
<Step title="Choose a blank or sample resume">
Click **Create** to start with an empty resume, or open the split-button menu and choose **Create a Sample Resume** to start with sample content.
<Tip>
A sample resume is useful when you want to explore templates, layout controls, and exports before entering your own
information.
</Tip>
</Step>
<Step title="Open the resume in the builder">
Once created, a new card for your resume will appear on the Dashboard. Click it to open the resume builder and start editing.
</Step>
</Steps>
## What you can do next
After creating your first resume, you can:
- change the template in [Choosing a template](/guides/choosing-a-template);
- adjust the page format in [Selecting the right page format](/guides/selecting-page-format);
- download a copy in [Exporting your resume](/guides/exporting-your-resume);
- organize, duplicate, lock, or delete resumes in [Managing resumes from the dashboard](/guides/managing-resumes-from-the-dashboard).