Skip Navigation
Self-Hosted Main @selfhosted.forum
AmruthPillai @alien.top
BOT

🚀 Introducing Reactive Resume v4, a free and open-source resume builder!

Hey r/selfhosted, get ready to craft your story like never before!

I’m thrilled to announce that Reactive Resume has just launched its latest version, and it's a game-changer in the resume-building space (at least, I’d like to think so).

Here’s a glimpse of some of the new features:

  • A sleek, polished user interface that makes navigation a breeze.
  • Faster PDF generation to get your resume out there quicker.
  • Integration with OpenAI for smarter assistance.
  • Brand new, highly customisable templates to fit your unique style.
  • Comprehensive documentation with user-friendly guides.
  • Enhanced security with two-factor authentication.
  • Available in multiple languages, contributed by the community.
  • Quality of life features such as locking resumes, adding personal notes to resumes, tracking views and downloads on your public resume etc.

The best part? It’s 100% free, forever! No ads, no user tracking, just pure resume-building bliss. Plus, for the tech-savvy, it’s also open-source on GitHub and self-hostable through Docker, something special just for this community.

Ready to give it a spin?
You can visit the website on https://rxresu.me, sure. But you're on r/selfhosted, so you're probably more interested in the "how to host it myself" part of the launch. The link to the repository is right here: https://github.com/AmruthPillai/Reactive-Resume/

Self-hosting Reactive Resume is super simple, compared to the nightmare it was in earlier versions having to ensure multiple services are communicating alright. You can check the GitHub repo (under tools/compose for many docker compose examples of how the project could be set up).

I'm excited to see how you make the most of it!

80 comments
  • this looks great!

    Question / Potential feature request if it doesn't exist

    there used to be a free resume service called rhubarb that'd let you write a bunch of bullet points and swap them in and out of your resume depending on the job you're applying to, so you'd essentially have one base resume that you could make variants of quickly and easily. their implementation let you click the "skills" section or the "work experience" section and a side bar would open up with your "bank" of all the skills or experience snippets you'd written and you'd simply click the plus or minus button to add or remove them for a specific "variant" of a resume you were working on.

    this was insanely useful in tech jobs where you'd have experience with like 20 different pieces of tech but a specific job you'd apply to would only use 10 and you could only fit like 15ish on your resume so you'd swap them around depending on the specific job you're applying to. do you guys have any feature like this where you support quickly making variations of a base resume to more custom tailor it to a singular position?

    It'd also let you track the jobs you've applied to by uploading the Job description (just simple copy and pasting of the page into a rich text editor, no link scraping or formatting or anything) and it'd give you basically an "match" score on how good the specific variant of your resume aligns with the skill sets posted for that particular position's job description. This part was probably just a simple python off-the-shelf machine learning script that does NTM or LDA or something, it wasn't amazing, and with chatgpt integration already in your app, you could probably do something a lot better for a lot lower effort.

    if these features don't exist in your app, adding them i think would make your app the resume app, because in the current job market, it's becoming more and more of the norm to shoot out dozens of resumes to land a single bite, and more and more, those resumes need to be custom tailored to the position especially in the age of chatgpt mass produced resumes. Even in tech, if you aren't custom tailoring your resume for each application your prospects of getting a call back are greatly diminished.

    So really this creates two problems your app could solve, easily customizing a "base" resume and keeping track of which job postings you've sent which resume to, both of these could be super overengineered, or just simple solutions, and both of these would make your app amazing if it doesn't have either!

  • /u/AmruthPillai hoping you can help unblock me on one thing. Running ReactiveResume via Portainer using the following docker compose script. Everything works fine, except PDF generation - which doesn't seem to do "anything". Nothing ever downloads, no separate window opens. The solution is awesome btw - I'm excited to get this working - just need to figure out the PDF part.

    version: "3.8"

    In this Docker Compose example, it assumes that you maintain a reverse proxy externally (or chose not to).

    The only two exposed ports here are from minio (:9000) and the app itself (:3000).

    If these ports are changed, ensure that the env vars passed to the app are also changed accordingly.

    Docker Compose:

    services:

    Storage (for image uploads)

    minio:

    image: minio/minio

    restart: unless-stopped

    command: server /data

    ports:

    9000:9000

    volumes:

    $DOCKERDIR/appdata/resume/miniodata:/data

    environment:

    MINIOROOTUSER: minioadmin

    MINIOROOTPASSWORD: 7FgkUNXE3YZe3PrE7U

    Chrome Browser (for printing and previews)

    chrome:

    image: browserless/chrome:1.61.0-puppeteer-21.4.1

    restart: unless-stopped

    environment:

    TOKEN: chrometoken

    EXITONHEALTHFAILURE: true

    PREREQUESTHEALTHCHECK: true

    Redis (for cache & server session management)

    redis:

    image: redis:alpine

    restart: unless-stopped

    command: redis-server --requirepass password

    app:

    image: amruthpillai/reactive-resume:latest

    restart: unless-stopped

    ports:

    3000:3000

    dependson:

    minio

    redis

    chrome

    environment:

    -- Environment Variables --

    PORT: 3000

    NODEENV: production

    -- URLs --

    PUBLICURL: $PUBLICURL

    STORAGEURL: $STORAGEURL

    -- Printer (Chrome) --

    CHROMETOKEN: chrometoken

    CHROMEURL: ws://chrome:3000

    -- Database (Postgres) --

    DATABASEURL: postgresql://$POSTGRESUSER:$POSTGRESPASSWORD@192.168.4.3:32781/postgres?schema=public

    -- Auth --

    ACCESSTOKENSECRET: PcaDMKAu.x8@iCTaB-

    REFRESHTOKENSECRET: yjXiGQkKNcVgEDUvt

    -- Emails --

    MAILFROM: resume@myurl.com

    SMTPURL: smtp://mysmptname:atznqf!cyfg@outbound.mailhop.org:587

    -- Storage (Minio) --

    STORAGEENDPOINT: minio

    STORAGEPORT: 9000

    STORAGEREGION: us-east-1 # Optional

    STORAGEBUCKET: default

    STORAGEACCESSKEY: minioadmin

    STORAGESECRETKEY: 7FgkUNAr8eb33E7U

    STORAGEUSESSL: false

    -- Cache (Redis) --

    REDISURL: redis://default:password@redis:6379

    -- Email (Optional) --

    DISABLEEMAILAUTH: true

    VITEDISABLESIGNUPS: true

    volumes:

    miniodata:

    postgresdata:

    ENVIRONMENTAL VARIABLES

    NODEENV=development

    PORT=3000

    DEVCLIENTPORT=5173 # Only used in development

    DEVCLIENTURL=http://localhost:5173 # Only used in development

    DEVARTBOARDPORT=6173 # Only used in development

    DEVARTBOARDURL=http://localhost:6173 # Only used in development

    PUBLICURL=http://resume.themyurl.com

    STORAGEURL=http://resume.themyurl.com/default # default is the bucket name specified in the STORAGEBUCKET variable

    POSTGRESPORT=32781

    POSTGRESDB=postgres

    POSTGRESUSER=myuser
    POSTGRESPASSWORD=mFQp2QCmypasswordDT@2

    DATABASEURL=postgresql://myuser:Thmypassword6@localhost:5432/postgres?schema=public

    ACCESSTOKENSECRET=accesstokensecret

    REFRESHTOKENSECRET=refreshtokensecret

    CHROMEPORT=8080

    CHROMETOKEN=chrometoken

    CHROMEURL=ws://resume.themyurl.com:8080

    MAILFROM=noreply@localhost

    STORAGEENDPOINT=resume.themyurl.com

    STORAGEPORT=9000

    STORAGEREGION=us-east-1

    STORAGEBUCKET=default

    STORAGEACCESSKEY=minioadmin

    STORAGESECRETKEY=minioadmin

    STORAGEUSESSL=false

    REDISURL=redis://default:password@localhost:6379

    CROWDINPROJECTID=

    CROWDINPERSONALTOKEN=

    PUID=1000

    PGID=1000

    TZ="America/Vancouver"

    DOCKERDIR="/nfs/docker"

    DATADIR="/nfs/data"

80 comments