diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml
index d7ea3a564..d89482a0a 100644
--- a/.github/ISSUE_TEMPLATE/1-bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml
@@ -1,68 +1,124 @@
name: 🐞 Bug Report
-description: Create a bug report to help improve Reactive Resume
+description: Report a reproducible problem with Reactive Resume
-title: "[Bug]
"
-labels: [bug, v5, needs triage]
-assignees: "AmruthPillai"
+labels: ["bug", "status: needs triage"]
+assignees: []
body:
- type: checkboxes
attributes:
- label: Is there an existing issue for this?
- description: Please search to see if an issue already exists for the bug you encountered.
+ label: Existing issue
+ description: Search open and closed issues before submitting a new report.
options:
- - label: Yes, I have searched the existing issues and none of them match my problem.
+ - label: I searched the existing issues and could not find a matching report.
required: true
- type: dropdown
id: variant
attributes:
- label: Product Variant
- description: What variant of Reactive Resume are you using?
+ label: Product variant
+ description: Where does the problem occur?
options:
- - Cloud (https://rxresu.me)
- - Self-Hosted
+ - Cloud
+ - Self-hosted
+ validations:
+ required: true
+
+ - type: input
+ id: version
+ attributes:
+ label: Reactive Resume version
+ description: Find this in Settings or provide the container image tag or commit SHA.
+ placeholder: 5.2.6
+ validations:
+ required: true
+
+ - type: dropdown
+ id: area
+ attributes:
+ label: Area
+ description: Choose the part of Reactive Resume most closely related to the problem.
+ options:
+ - Resume builder & data
+ - Templates, preview & export
+ - Accounts & sharing
+ - AI & Agent
+ - Language & localization
+ - Self-hosting
+ - API & integrations
+ - Applications & cover letters
+ - Other / unsure
+ validations:
+ required: true
+
+ - type: input
+ id: environment
+ attributes:
+ label: Environment
+ description: Include your operating system and browser. For self-hosted installations, also include the deployment method.
+ placeholder: Firefox 143 on Ubuntu 26.04, deployed with Docker Compose
validations:
required: true
- type: textarea
+ id: summary
attributes:
- label: Describe the bug you're experiencing
- description: A detailed description of what you're experiencing. Please provide as much detail as possible as it will help me diagnose and fix the issue faster.
+ label: Summary
+ description: Briefly describe the problem and its impact.
+ validations:
+ required: true
+
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: Steps to reproduce
+ description: Provide the smallest reliable sequence that demonstrates the problem.
+ placeholder: |
+ 1. Open ...
+ 2. Select ...
+ 3. Observe ...
+ validations:
+ required: true
+
+ - type: textarea
+ id: expected
+ attributes:
+ label: Expected behavior
+ validations:
+ required: true
+
+ - type: textarea
+ id: actual
+ attributes:
+ label: Actual behavior
validations:
required: true
- type: dropdown
id: template
attributes:
- label: What template are you using?
- description: Leave blank if the issue applies to all templates, or is not template-specific.
- multiple: false
+ label: Template
+ description: Leave blank when the problem is not template-specific.
options:
- Azurill
- Bronzor
- Chikorita
- - Ditto
- Ditgar
+ - Ditto
- Gengar
- Glalie
- Kakuna
- Lapras
- Leafish
+ - Meowth
- Onyx
- Pikachu
- Rhyhorn
- Scizor
- validations:
- required: false
- type: textarea
+ id: logs
attributes:
- label: Anything else?
- description: |
- Links? References? Anything that will give us more context about the issue you are encountering!
-
- Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
- validations:
- required: false
+ label: Logs and screenshots
+ description: Add relevant logs, screenshots, or a minimal reproduction. Remove secrets and personal resume data first.
diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml
index e4a0665c4..30fcebc74 100644
--- a/.github/ISSUE_TEMPLATE/2-feature-request.yml
+++ b/.github/ISSUE_TEMPLATE/2-feature-request.yml
@@ -1,23 +1,82 @@
name: ✨ Feature Request
-description: Suggest an feature or idea that you would like to see in Reactive Resume
+description: Propose an actionable improvement to Reactive Resume
-title: "[Feature] "
-labels: [enhancement, v5, needs triage]
-assignees: "AmruthPillai"
+labels: ["enhancement", "status: needs triage"]
+assignees: []
body:
- type: checkboxes
attributes:
- label: Is there an existing issue for this feature?
- description: Please search to see if an issue already exists for the feature you requested.
+ label: Existing issue
+ description: Search open and closed issues before submitting a new proposal.
options:
- - label: Yes, I have searched the existing issues and it doesn't exist.
+ - label: I searched the existing issues and could not find a matching proposal.
required: true
- - type: textarea
+ - type: dropdown
+ id: variant
attributes:
- label: Feature Description
- description: A detailed description of the feature you would like to see in Reactive Resume. Please provide as much detail as possible as it will help me implement the feature faster.
+ label: Product variant
+ description: Choose the primary environment for this proposal.
+ options:
+ - Cloud
+ - Self-hosted
validations:
required: true
+
+ - type: dropdown
+ id: area
+ attributes:
+ label: Area
+ description: Choose the part of Reactive Resume most closely related to the proposal.
+ options:
+ - Resume builder & data
+ - Templates, preview & export
+ - Accounts & sharing
+ - AI & Agent
+ - Language & localization
+ - Self-hosting
+ - API & integrations
+ - Applications & cover letters
+ - Other / unsure
+ validations:
+ required: true
+
+ - type: textarea
+ id: problem
+ attributes:
+ label: Problem
+ description: What user problem or limitation should Reactive Resume solve?
+ validations:
+ required: true
+
+ - type: textarea
+ id: outcome
+ attributes:
+ label: Desired outcome
+ description: Describe the behavior you want without prescribing an implementation.
+ validations:
+ required: true
+
+ - type: textarea
+ id: alternatives
+ attributes:
+ label: Alternatives considered
+ description: Describe current workarounds or alternatives. Write "None" if there are none.
+ validations:
+ required: true
+
+ - type: textarea
+ id: scope
+ attributes:
+ label: Proposed scope
+ description: Explain what should be included and what can remain out of scope.
+ validations:
+ required: true
+
+ - type: textarea
+ id: context
+ attributes:
+ label: Additional context
+ description: Add examples, mockups, or related issues when useful. Remove personal resume data first.
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 3ba13e0ce..14150b500 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1 +1,8 @@
blank_issues_enabled: false
+contact_links:
+ - name: Questions and support
+ url: https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a
+ about: Get help with setup, configuration, and using Reactive Resume.
+ - name: Security vulnerability
+ url: https://github.com/amruthpillai/reactive-resume/security/advisories/new
+ about: Report security vulnerabilities privately.
diff --git a/.github/workflows/label-issues.yml b/.github/workflows/label-issues.yml
new file mode 100644
index 000000000..3908f4695
--- /dev/null
+++ b/.github/workflows/label-issues.yml
@@ -0,0 +1,30 @@
+name: Label New Issues
+
+on:
+ issues:
+ types: [opened]
+
+permissions:
+ contents: read
+ issues: write
+
+jobs:
+ label:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
+ with:
+ persist-credentials: false
+
+ - name: Apply Form Labels
+ uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9
+ with:
+ script: |
+ const { getIssueLabels } = await import(`${process.env.GITHUB_WORKSPACE}/tooling/issue-labels.mjs`);
+ const labels = getIssueLabels(context.payload.issue.body ?? "");
+
+ if (labels.length > 0) {
+ await github.rest.issues.addLabels({ ...context.issue, labels });
+ }
diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml
new file mode 100644
index 000000000..45bdc37e2
--- /dev/null
+++ b/.github/workflows/stale-issues.yml
@@ -0,0 +1,30 @@
+name: Close Issues Awaiting Information
+
+on:
+ schedule:
+ - cron: "23 4 * * *"
+ workflow_dispatch:
+
+permissions:
+ issues: write
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Close Inactive Issues Awaiting Information
+ uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11
+ with:
+ only-issue-labels: "status: needs info"
+ days-before-issue-stale: 14
+ days-before-issue-close: 7
+ days-before-pr-stale: -1
+ days-before-pr-close: -1
+ stale-issue-label: stale
+ stale-issue-message: >-
+ This issue is waiting for information requested by a maintainer. It will close in 7 days if no new information is provided.
+ close-issue-message: >-
+ Closing because the requested information was not provided. Add the missing details in a comment and a maintainer can reopen the issue.
+ close-issue-reason: not_planned
+ remove-issue-stale-when-updated: true
diff --git a/README.md b/README.md
index 7602fad26..613c34ffe 100644
--- a/README.md
+++ b/README.md
@@ -234,7 +234,8 @@ Reactive Resume is and always will be free and open-source. If it has helped you
Other ways to support:
- Star this repository
-- Report bugs and suggest features
+- Report reproducible bugs and suggest actionable features
+- Help other users in [GitHub Discussions](https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a)
- Improve documentation
- Help with translations
@@ -260,6 +261,10 @@ Contributions make open-source thrive. Whether fixing a typo or adding a feature
See the [development setup guide](https://docs.rxresu.me/contributing/development) for detailed instructions on how to set up the project locally.
+Maintainers review the [`status: needs triage` queue](https://github.com/amruthpillai/reactive-resume/issues?q=is%3Aissue+is%3Aopen+label%3A%22status%3A+needs+triage%22)
+weekly. Triaged bugs become `status: confirmed`; feature proposals become `status: accepted`; reports that need details become
+`status: needs info`.
+
## License
[MIT](./LICENSE) — do whatever you want with it.
diff --git a/docs/getting-started.mdx b/docs/getting-started.mdx
index 8fac96a18..f8e62e301 100644
--- a/docs/getting-started.mdx
+++ b/docs/getting-started.mdx
@@ -96,7 +96,10 @@ Reactive Resume is built with modern web technologies:
- Star the repo, report issues, and contribute to the project.
+ Star the repo, report reproducible bugs, propose features, and contribute to the project.
+
+
+ Ask questions about setup, configuration, and using Reactive Resume.
Join our Reddit community to get help and connect with other users.
@@ -110,5 +113,6 @@ Reactive Resume is built with modern web technologies:
- **Need help?** Feel free to reach out via [email](mailto:hello@amruthpillai.com) or open an issue on GitHub.
+ **Need help?** Start a [GitHub Discussion](https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a).
+ GitHub Issues are reserved for reproducible bugs and actionable feature proposals.
diff --git a/knip.json b/knip.json
index 98832afe4..b6b17d863 100644
--- a/knip.json
+++ b/knip.json
@@ -62,6 +62,9 @@
"uuid"
]
},
+ "tooling": {
+ "entry": ["issue-labels.mjs"]
+ },
"packages/api": {
"ignoreDependencies": ["ioredis"]
}
diff --git a/tooling/issue-labels.mjs b/tooling/issue-labels.mjs
new file mode 100644
index 000000000..cd49a4ba6
--- /dev/null
+++ b/tooling/issue-labels.mjs
@@ -0,0 +1,46 @@
+import assert from "node:assert/strict";
+
+const fields = [
+ [
+ "Product variant",
+ {
+ Cloud: "deployment: cloud",
+ "Self-hosted": "deployment: self-hosted",
+ },
+ ],
+ [
+ "Area",
+ {
+ "Resume builder & data": "area: builder",
+ "Templates, preview & export": "area: rendering",
+ "Accounts & sharing": "area: account",
+ "AI & Agent": "area: ai",
+ "Language & localization": "area: localization",
+ "Self-hosting": "area: self-hosting",
+ "API & integrations": "area: integrations",
+ "Applications & cover letters": "area: applications",
+ },
+ ],
+];
+
+export function getIssueLabels(body) {
+ return fields.flatMap(([heading, labels]) => {
+ const answer = body.match(new RegExp(`^### ${heading}\\r?\\n\\r?\\n([^\\r\\n]+)$`, "m"))?.[1].trim();
+ return answer && labels[answer] ? [labels[answer]] : [];
+ });
+}
+
+if (import.meta.main) {
+ const issueBody = `### Product variant
+
+Self-hosted
+
+### Area
+
+Templates, preview & export`;
+
+ assert.deepEqual(getIssueLabels(issueBody), ["deployment: self-hosted", "area: rendering"]);
+ assert.deepEqual(getIssueLabels("### Area\n\nOther / unsure"), []);
+ assert.deepEqual(getIssueLabels("#### Area\n\nAI & Agent"), []);
+ assert.deepEqual(getIssueLabels("prefix ### Area\n\nAI & Agent"), []);
+}