Files
Reactive-Resume/docs/guides/sharing-your-resume-publicly.mdx
T
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

234 lines
8.8 KiB
Plaintext

---
title: "Sharing your resume publicly"
description: "Learn how to share your resume via a public URL, track public engagement, and optionally protect your resume with a password."
---
Reactive Resume lets you share your resume via a **public URL** that anyone can access. When you make your resume public, it becomes available at a unique link that you can share with recruiters, include in your portfolio, or add to your LinkedIn profile.
## Key benefits of public sharing
<CardGroup cols={2}>
<Card title="Always up-to-date" icon="arrows-rotate">
Viewers always see the latest version of your resume. No need to send new files when you make updates.
</Card>
<Card title="Track engagement" icon="chart-line">
See public engagement counters in the builder.
</Card>
<Card title="Password protection" icon="lock">
Optionally require a password so only people you trust can access your resume.
</Card>
<Card title="Easy to share" icon="share">
A simple URL that works anywhere—email signatures, LinkedIn, portfolios, job applications.
</Card>
</CardGroup>
## How to enable public sharing
<Steps>
<Step title="Open your resume in the builder">
Navigate to your resume in the resume builder.
</Step>
<Step title="Go to the Sharing section">In the **right sidebar**, select **Sharing**.</Step>
<Step title="Toggle 'Allow Public Access'">
Turn on the **Allow Public Access** switch. Once enabled, your resume will be accessible via its public URL.
<Frame caption="Sharing section in the resume builder">
<img
src="/images/guides/sharing-your-resume-publicly/screenshot-1.webp"
alt="Sharing section showing the public access control"
/>
</Frame>
</Step>
<Step title="Copy your public URL">
Your public URL is displayed below the toggle. It follows this format:
```
https://rxresu.me/{username}/{slug}
```
Click the **copy** button to copy the URL to your clipboard.
</Step>
</Steps>
<Tip>
The `{slug}` is the unique, URL-safe name you assign to your resume when you create it. If you want to change your
slug, go to the dashboard, right-click your resume card, and choose "Update" to edit its details.
</Tip>
## How the public URL works
When someone visits your public resume URL:
1. **They see the live version** - The page renders your current resume data with all your latest changes
2. **No account required** - Visitors don't need a Reactive Resume account to view or download your resume
3. **They can download a PDF** - Visitors can use the download button on the public page
4. **Views are tracked** - Each visit is counted in your resume statistics (see below)
<Info>
Changes you make in the builder are reflected immediately on the public URL. There's no separate "publish" step—your
public resume is always in sync.
</Info>
## Tracking public engagement
When your resume is public, Reactive Resume tracks public views. This helps you understand whether people are opening the link you shared.
### Where to find statistics
In the resume builder, open the **right sidebar** and select **Statistics**.
You'll see:
| Metric | Description |
| ------------------- | ---------------------------------------------------------------- |
| **Views** | Number of times your public resume page was visited |
| **Last viewed** | The date when your resume was last viewed |
| **Downloads** | Number of recorded resume downloads |
| **Last downloaded** | The date when the last recorded download happened |
<Info>
Statistics are only shown after public sharing is enabled. If you turn off public access, existing stats are
preserved.
</Info>
### What counts as a view?
A view is counted each time someone loads your public resume page. This includes:
- Direct visits to your public URL
- Clicks from links you've shared
- Search engine visits (if your resume is indexed)
<Note>
Only **you** can see your resume's statistics. Visitors to your public URL cannot see how many views or downloads your
resume has.
</Note>
## Password protecting your resume
If you want to share your resume with specific people but keep it private from the general public, you can add password protection.
When password protection is enabled:
- Visitors must enter the correct password to view your resume
- The password prompt appears before any resume content is shown
- You can share the password separately with trusted individuals
### How to set a password
<Steps>
<Step title="Enable public access">
First, make sure **Allow Public Access** is turned on in the **Sharing** section.
</Step>
<Step title="Click Set Password">Below the public URL, click **Set Password**.</Step>
<Step title="Enter your password">
Type a password (6-64 characters) and confirm. This password will be required to view your resume.
</Step>
<Step title="Share the password separately">
Share the password with your intended audience through a secure channel (e.g., direct message, email).
</Step>
</Steps>
<Warning>
Choose a password you're comfortable sharing. Anyone with the password can view and download your resume.
</Warning>
### How to remove password protection
If you no longer need password protection:
1. Go to the **Sharing** section in the right sidebar
2. Click **Remove Password**
3. Confirm the action
Your resume will become accessible to anyone with the public URL.
## Use cases for public sharing
<AccordionGroup>
<Accordion title="LinkedIn profile" icon="linkedin">
Add your public resume URL to your LinkedIn profile's **Featured** section or **Contact Info**. Recruiters can view your detailed resume directly.
</Accordion>
<Accordion title="Email signature" icon="envelope">
Include your resume link in your email signature. Anyone you correspond with can quickly access your resume.
</Accordion>
<Accordion title="Portfolio website" icon="globe">
Embed or link to your resume from your personal website. The link always shows your latest resume.
</Accordion>
<Accordion title="Job applications" icon="briefcase">
Some applications ask for a link to your resume. Your public URL is a professional alternative to file uploads.
</Accordion>
<Accordion title="Networking events" icon="users">
Share your resume URL via QR code or NFC. Update your resume before the event and everyone gets the latest version.
</Accordion>
<Accordion title="Confidential job search" icon="lock">
Use password protection to share your resume only with specific recruiters while keeping it hidden from your current employer.
</Accordion>
</AccordionGroup>
## Turning off public access
To make your resume private again:
1. Go to the **Sharing** section in the right sidebar
2. Turn off the **Allow Public Access** switch
When public access is disabled:
- Your public URL returns a "not found" error
- Existing links stop working immediately
- Your statistics are preserved (they'll resume if you re-enable public access)
- Password protection settings are preserved
<Tip>
If you only want to temporarily hide your resume, consider using password protection instead of disabling public
access entirely. This way, your URL remains active for people who have the password.
</Tip>
## Copying the URL from the builder dock
The builder dock includes a **Copy URL** shortcut. It copies the same public URL shown in the **Sharing** section.
<Warning>
Copying the URL does not enable public access. Turn on **Allow Public Access** in the **Sharing** section before sending
the link to someone else.
</Warning>
## Frequently asked questions
<AccordionGroup>
<Accordion title="Can I customize my public URL?">
Yes! The URL is based on your **username** and the resume's **slug**. You can change the slug in the **Update Resume** dialog. To open it, right-click on your resume card in the dashboard and select "Update". The username is set in your account settings.
</Accordion>
<Accordion title="Will search engines index my public resume?">
Public resumes may be indexed by search engines. If you want to prevent indexing, use password protection or keep your
resume private.
</Accordion>
<Accordion title="Do views from my own visits count?">
Views are only counted when someone visits your public resume URL while not logged in. Visits made while you're logged
in to your account are not included in the view statistics.
</Accordion>
<Accordion title="Can I see who viewed my resume?">
No, Reactive Resume only tracks view and download counts, not the identity of visitors. This protects visitor privacy.
</Accordion>
<Accordion title="What happens if I change my username?">
Your public URL will change to reflect the new username. Old URLs will stop working immediately. You might need to update any links you've shared.
</Accordion>
</AccordionGroup>