Skip to content

Commit e87b05a

Browse files
committed
release: v4.1.0
1 parent 68252c3 commit e87b05a

File tree

282 files changed

+11462
-10714
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

282 files changed

+11462
-10714
lines changed

.dockerignore

+1-7
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,8 @@ Dockerfile
2222
*.sublime-workspace
2323

2424
# IDE - VSCode
25-
.vscode/*
26-
!.vscode/settings.json
27-
!.vscode/tasks.json
28-
!.vscode/launch.json
29-
!.vscode/extensions.json
30-
31-
# IDE - Visual Studio
3225
.vs/*
26+
.vscode/*
3327
!.vscode/settings.json
3428
!.vscode/tasks.json
3529
!.vscode/launch.json

.env.example

+6-15
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@ NODE_ENV=development
44
# Ports
55
PORT=3000
66

7-
# Client Port & URL (for development)
8-
__DEV__CLIENT_PORT=5173 # Only used in development
9-
__DEV__CLIENT_URL=http://localhost:5173 # Only used in development
10-
11-
# Artboard Port & URL (for development)
12-
__DEV__ARTBOARD_PORT=6173 # Only used in development
13-
__DEV__ARTBOARD_URL=http://localhost:6173 # Only used in development
14-
157
# URLs
168
# These URLs must reference a publicly accessible domain or IP address, not a docker container ID (depending on your compose setup)
179
PUBLIC_URL=http://localhost:3000
@@ -53,19 +45,18 @@ STORAGE_ACCESS_KEY=minioadmin
5345
STORAGE_SECRET_KEY=minioadmin
5446
STORAGE_USE_SSL=false
5547

56-
# Redis (for cache & server session management)
57-
REDIS_URL=redis://default:password@localhost:6379
58-
5948
# Sentry (for error reporting, Optional)
60-
# VITE_SENTRY_DSN=
49+
# SERVER_SENTRY_DSN=
50+
# VITE_CLIENT_SENTRY_DSN=
6151

6252
# Crowdin (Optional)
63-
CROWDIN_PROJECT_ID=
64-
CROWDIN_PERSONAL_TOKEN=
53+
# CROWDIN_PROJECT_ID=
54+
# CROWDIN_PERSONAL_TOKEN=
6555

66-
# Email (Optional)
56+
# Flags (Optional)
6757
# DISABLE_EMAIL_AUTH=true
6858
# VITE_DISABLE_SIGNUPS=false
59+
# SKIP_STORAGE_BUCKET_CHECK=false
6960

7061
# GitHub (OAuth, Optional)
7162
# GITHUB_CLIENT_ID=

.eslintrc.json

+31-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
"extends": ["plugin:prettier/recommended"],
99
"plugins": ["simple-import-sort", "unused-imports"],
1010
"rules": {
11+
// eslint
12+
"no-return-await": "off",
13+
1114
// simple-import-sort
1215
"simple-import-sort/imports": "error",
1316
"simple-import-sort/exports": "error",
@@ -43,10 +46,36 @@
4346
},
4447
{
4548
"files": ["*.ts", "*.tsx"],
46-
"extends": ["plugin:@nx/typescript"],
49+
"parser": "@typescript-eslint/parser",
50+
"parserOptions": {
51+
"sourceType": "module",
52+
"ecmaVersion": "latest",
53+
"project": ["tsconfig.*?.json"]
54+
},
55+
"extends": [
56+
"plugin:@nx/typescript",
57+
"plugin:@typescript-eslint/strict-type-checked",
58+
"plugin:@typescript-eslint/stylistic-type-checked",
59+
"plugin:unicorn/recommended"
60+
],
61+
"plugins": ["@typescript-eslint", "unicorn"],
4762
"rules": {
4863
// typescript-eslint
49-
"@typescript-eslint/no-unused-vars": "off"
64+
"@typescript-eslint/no-unsafe-call": "off",
65+
"@typescript-eslint/no-unused-vars": "off",
66+
"@typescript-eslint/return-await": "error",
67+
"@typescript-eslint/no-unsafe-return": "off",
68+
"@typescript-eslint/no-unsafe-argument": "off",
69+
"@typescript-eslint/no-misused-promises": "off",
70+
"@typescript-eslint/no-unsafe-assignment": "off",
71+
"@typescript-eslint/no-unsafe-member-access": "off",
72+
"@typescript-eslint/restrict-template-expressions": "off",
73+
"@typescript-eslint/consistent-type-definitions": ["error", "type"],
74+
75+
// unicorn
76+
"unicorn/no-null": "off",
77+
"unicorn/prevent-abbreviations": "off",
78+
"unicorn/prefer-string-replace-all": "off"
5079
}
5180
},
5281
{

.github/ISSUE_TEMPLATE/bug-report.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ body:
2121
label: Product Variant
2222
description: What variant of Reactive Resume are you using?
2323
options:
24-
- Cloud (http://rxresu.me)
24+
- Cloud (https://rxresu.me)
2525
- Self-Hosted
2626
validations:
2727
required: true

.github/workflows/publish-docker-image.yml

+14-6
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@ jobs:
3838
- name: Set up QEMU
3939
uses: docker/[email protected]
4040

41-
- name: Set up Docker Buildx
42-
uses: docker/[email protected]
43-
4441
- name: Login to Docker Hub
4542
uses: docker/[email protected]
4643
with:
@@ -54,6 +51,13 @@ jobs:
5451
username: ${{ github.repository_owner }}
5552
password: ${{ github.token }}
5653

54+
- name: Set up Docker Buildx
55+
uses: docker/[email protected]
56+
with:
57+
driver: cloud
58+
version: "lab:latest"
59+
endpoint: "amruthpillai/default"
60+
5761
- name: Extract Docker Metadata
5862
id: meta
5963
uses: docker/[email protected]
@@ -111,9 +115,6 @@ jobs:
111115
pattern: digests-*
112116
merge-multiple: true
113117

114-
- name: Set up Docker Buildx
115-
uses: docker/[email protected]
116-
117118
- name: Login to Docker Hub
118119
uses: docker/[email protected]
119120
with:
@@ -127,6 +128,13 @@ jobs:
127128
username: ${{ github.repository_owner }}
128129
password: ${{ github.token }}
129130

131+
- name: Set up Docker Buildx
132+
uses: docker/[email protected]
133+
with:
134+
driver: cloud
135+
version: "lab:latest"
136+
endpoint: "amruthpillai/default"
137+
130138
- name: Extract Docker Metadata
131139
id: meta
132140
uses: docker/[email protected]

.gitignore

+1-7
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,8 @@ node_modules
1616
*.sublime-workspace
1717

1818
# IDE - VSCode
19-
.vscode/*
20-
!.vscode/settings.json
21-
!.vscode/tasks.json
22-
!.vscode/launch.json
23-
!.vscode/extensions.json
24-
25-
# IDE - Visual Studio
2619
.vs/*
20+
.vscode/*
2721
!.vscode/settings.json
2822
!.vscode/tasks.json
2923
!.vscode/launch.json

CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ When it comes to **security**, you now have the option to protect your account w
1414

1515
From a **design** perspective, the motivation behind this is to ensure that Reactive Resume is taken more seriously and not perceived as just another subpar side-project, which is often associated with free software. My goal is to demonstrate that this is not the case, and that **free and open source software can be just as good**, if not better, than paid alternatives.
1616

17-
From a **self-hosting perspective**, it has never been simpler. Instead of running two separate services on your Docker (one for the client and one for the server) and struggling to establish communication between them, now you only need to pull a single image. Additionally, there are a few dependent services available on Docker (such as Postgres, Redis, Minio etc.) that you can also pull and have them all working together seamlessly.
17+
From a **self-hosting perspective**, it has never been simpler. Instead of running two separate services on your Docker (one for the client and one for the server) and struggling to establish communication between them, now you only need to pull a single image. Additionally, there are a few dependent services available on Docker (such as Postgres, Minio etc.) that you can also pull and have them all working together seamlessly.
1818

1919
I'm excited for you to try out the app, as I've spent months building it to perfection. If you enjoy the experience of building your resume using the app, please consider supporting by [becoming a GitHub Sponsor](https://github.com/sponsors/AmruthPillai).

CONTRIBUTING.md

+3-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Getting the project set up locally
44

5-
There are a number of Docker Compose examples that are suitable for a wide variety of deployment strategies depending on your use-case. All of the examples can be found in the `tools/compose` folder.
5+
There are a number of Docker Compose examples that are suitable for a wide variety of deployment strategies depending on your use-case. All the examples can be found in the `tools/compose` folder.
66

77
To run the development environment of the application locally on your computer, please follow these steps:
88

@@ -57,15 +57,13 @@ You can also visit `http://localhost:3000/api/health`, the health check endpoint
5757
"info": {
5858
"database": { "status": "up" },
5959
"storage": { "status": "up" },
60-
"browser": { "status": "up", "version": "Chrome/119.0.6045.9" },
61-
"redis": { "status": "up" }
60+
"browser": { "status": "up", "version": "Chrome/119.0.6045.9" }
6261
},
6362
"error": {},
6463
"details": {
6564
"database": { "status": "up" },
6665
"storage": { "status": "up" },
67-
"browser": { "status": "up", "version": "Chrome/119.0.6045.9" },
68-
"redis": { "status": "up" }
66+
"browser": { "status": "up", "version": "Chrome/119.0.6045.9" }
6967
}
7068
}
7169
```

README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ Start creating your standout resume with Reactive Resume today!
4040

4141
- **Free, forever** and open-source
4242
- No telemetry, user tracking or advertising
43-
- You can self-host the application in less then 30 seconds
43+
- You can self-host the application in less than 30 seconds
4444
- **Available in multiple languages** ([help add/improve your language here](https://translate.rxresu.me/))
4545
- Use your email address (or a throw-away address, no problem) to create an account
4646
- You can also sign in with your GitHub or Google account, and even set up two-factor authentication for extra security
47-
- Create as many resumes as you like under a single account, optimising each resume for every job application based on it’s description for a higher ATS score
47+
- Create as many resumes as you like under a single account, optimising each resume for every job application based on its description for a higher ATS score
4848
- **Bring your own OpenAI API key** and unlock features such as improving your writing, fixing spelling and grammar or changing the tone of your text in one-click
4949
- Translate your resume into any language using ChatGPT and import it back for easier editing
5050
- Create single page resumes or a resume that spans multiple pages easily
@@ -69,7 +69,6 @@ Start creating your standout resume with Reactive Resume today!
6969
- NestJS, for the backend
7070
- Postgres (primary database)
7171
- Prisma ORM, which frees you to switch to any other relational database with a few minor changes in the code
72-
- Redis (for caching, session storage and resume statistics)
7372
- Minio (for object storage: to store avatars, resume PDFs and previews)
7473
- Browserless (for headless chrome, to print PDFs and generate previews)
7574
- SMTP Server (to send password recovery emails)

SECURITY.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@
1111

1212
## Reporting a Vulnerability
1313

14-
Please raise an issue on GitHub to report any security vulnerabilities in the app. If the vulnerability is potentially lethal, send me an email about it on [email protected].
14+
Please raise an issue on GitHub to report any security vulnerabilities in the app. If the vulnerability is potentially lethal, email me about it on [email protected].

apps/artboard/.eslintrc.json

+12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@
1212
}
1313
},
1414
"rules": {
15+
// react
16+
"react/no-unescaped-entities": "off",
17+
"react/jsx-sort-props": [
18+
"error",
19+
{
20+
"reservedFirst": true,
21+
"callbacksLast": true,
22+
"shorthandFirst": true,
23+
"noSortAlphabetically": true
24+
}
25+
],
26+
1527
// react-hooks
1628
"react-hooks/exhaustive-deps": "off",
1729

apps/artboard/postcss.config.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
const { join } = require("path");
1+
const path = require("node:path");
22

33
module.exports = {
44
plugins: {
55
tailwindcss: {
6-
config: join(__dirname, "tailwind.config.js"),
6+
config: path.join(__dirname, "tailwind.config.js"),
77
},
88
autoprefixer: {},
99
},

apps/artboard/src/main.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { RouterProvider } from "react-router-dom";
44

55
import { router } from "./router";
66

7-
const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);
7+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
8+
const root = ReactDOM.createRoot(document.querySelector("#root")!);
89

910
root.render(
1011
<StrictMode>

apps/artboard/src/pages/artboard.tsx

+8-8
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,20 @@ export const ArtboardPage = () => {
3939
`${metadata.typography.lineHeight}`,
4040
);
4141

42-
document.documentElement.style.setProperty("--color-text", `${metadata.theme.text}`);
43-
document.documentElement.style.setProperty("--color-primary", `${metadata.theme.primary}`);
44-
document.documentElement.style.setProperty(
45-
"--color-background",
46-
`${metadata.theme.background}`,
47-
);
42+
document.documentElement.style.setProperty("--color-text", metadata.theme.text);
43+
document.documentElement.style.setProperty("--color-primary", metadata.theme.primary);
44+
document.documentElement.style.setProperty("--color-background", metadata.theme.background);
4845
}, [metadata]);
4946

5047
// Typography Options
5148
useEffect(() => {
52-
document.querySelectorAll(`[data-page]`).forEach((el) => {
49+
// eslint-disable-next-line unicorn/prefer-spread
50+
const elements = Array.from(document.querySelectorAll(`[data-page]`));
51+
52+
for (const el of elements) {
5353
el.classList.toggle("hide-icons", metadata.typography.hideIcons);
5454
el.classList.toggle("underline-links", metadata.typography.underlineLinks);
55-
});
55+
}
5656
}, [metadata]);
5757

5858
return <Outlet />;

apps/artboard/src/pages/builder.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ export const BuilderLayout = () => {
3838

3939
return (
4040
<TransformWrapper
41+
ref={transformRef}
4142
centerOnInit
4243
maxScale={2}
4344
minScale={0.4}
4445
initialScale={0.8}
45-
ref={transformRef}
4646
limitToBounds={false}
4747
>
4848
<TransformComponent
@@ -56,8 +56,8 @@ export const BuilderLayout = () => {
5656
<AnimatePresence>
5757
{layout.map((columns, pageIndex) => (
5858
<motion.div
59-
layout
6059
key={pageIndex}
60+
layout
6161
initial={{ opacity: 0, x: -200, y: 0 }}
6262
animate={{ opacity: 1, x: 0, transition: { delay: pageIndex * 0.3 } }}
6363
exit={{ opacity: 0, x: -200 }}

apps/artboard/src/providers/index.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ export const Providers = () => {
2020
};
2121

2222
const resumeData = window.localStorage.getItem("resume");
23-
if (resumeData) return setResume(JSON.parse(resumeData));
23+
if (resumeData) {
24+
setResume(JSON.parse(resumeData));
25+
return;
26+
}
2427

2528
window.addEventListener("message", handleMessage);
2629

@@ -34,6 +37,7 @@ export const Providers = () => {
3437
// setResume(sampleResume);
3538
// }, [setResume]);
3639

40+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
3741
if (!resume) return null;
3842

3943
return <Outlet />;

apps/artboard/src/store/artboard.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@ export type ArtboardStore = {
88

99
export const useArtboardStore = create<ArtboardStore>()((set) => ({
1010
resume: null as unknown as ResumeData,
11-
setResume: (resume) => set({ resume }),
11+
setResume: (resume) => {
12+
set({ resume });
13+
},
1214
}));

0 commit comments

Comments
 (0)