mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-26 01:44:53 +10:00
6d8d8f6e55
* 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
234 lines
8.8 KiB
Plaintext
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>
|