diff --git a/.github/.well-known/funding.json b/.github/.well-known/funding.json index 653ce4acf..1b1c2c82e 100644 --- a/.github/.well-known/funding.json +++ b/.github/.well-known/funding.json @@ -20,8 +20,8 @@ "url": "https://rxresu.me" }, "repositoryUrl": { - "url": "https://github.com/amruthpillai/reactive-resume", - "wellKnown": "https://github.com/amruthpillai/reactive-resume/blob/main/.github/.well-known/funding-manifest-urls" + "url": "https://github.com/reactive-resume/app", + "wellKnown": "https://github.com/reactive-resume/app/blob/main/.github/.well-known/funding-manifest-urls" }, "licenses": ["spdx:MIT"], "tags": ["data", "design", "productivity", "resume-builder"] diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 14150b500..862552ba2 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ blank_issues_enabled: false contact_links: - name: Questions and support - url: https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a + url: https://github.com/reactive-resume/app/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 + url: https://github.com/reactive-resume/app/security/advisories/new about: Report security vulnerabilities privately. diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 622c2f7c9..e9ea477b9 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -2,6 +2,11 @@ name: Build Docker Image on: workflow_dispatch: + inputs: + release: + description: Publish release aliases and redeploy production (false runs a cache-only build, then publishes a canary) + type: boolean + default: false push: branches: - main @@ -13,7 +18,8 @@ concurrency: cancel-in-progress: true env: - IMAGE: ${{ github.repository }} + GHCR_IMAGE: ghcr.io/${{ github.repository }} + DOCKER_IMAGE: docker.io/amruthpillai/reactive-resume FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true jobs: @@ -23,20 +29,28 @@ jobs: outputs: nightly: ${{ steps.mode.outputs.nightly }} release: ${{ steps.mode.outputs.release }} - matrix: ${{ steps.mode.outputs.matrix }} + canary: ${{ steps.mode.outputs.canary }} steps: - name: Determine publishing mode id: mode + env: + EVENT_NAME: ${{ github.event_name }} + GIT_REF: ${{ github.ref }} + RELEASE: ${{ inputs.release }} run: | - if [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" == "refs/heads/main" ]]; then + if [[ "$EVENT_NAME" == "push" && "$GIT_REF" == "refs/heads/main" ]]; then echo "nightly=true" >> "$GITHUB_OUTPUT" echo "release=false" >> "$GITHUB_OUTPUT" - echo 'matrix={"include":[{"platform":"linux/amd64","runner":"ubuntu-latest","arch":"amd64"}]}' >> "$GITHUB_OUTPUT" + echo "canary=false" >> "$GITHUB_OUTPUT" + elif [[ "$EVENT_NAME" == "workflow_dispatch" && "$RELEASE" != "true" ]]; then + echo "nightly=false" >> "$GITHUB_OUTPUT" + echo "release=false" >> "$GITHUB_OUTPUT" + echo "canary=true" >> "$GITHUB_OUTPUT" else echo "nightly=false" >> "$GITHUB_OUTPUT" echo "release=true" >> "$GITHUB_OUTPUT" - echo 'matrix={"include":[{"platform":"linux/amd64","runner":"ubuntu-latest","arch":"amd64"},{"platform":"linux/arm64","runner":"ubuntu-24.04-arm","arch":"arm64"}]}' >> "$GITHUB_OUTPUT" + echo "canary=false" >> "$GITHUB_OUTPUT" fi build: @@ -66,8 +80,10 @@ jobs: - name: Checkout Repository uses: actions/checkout@v6 - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v4 + - name: Setup Blacksmith Docker Builder + uses: useblacksmith/setup-docker-builder@v2 + with: + cache-key: Dockerfile-${{ matrix.arch }} - name: Login to Docker Hub uses: docker/login-action@v4 @@ -87,14 +103,22 @@ jobs: uses: docker/metadata-action@v6 with: images: | - ghcr.io/${{ env.IMAGE }} - docker.io/${{ env.IMAGE }} + ${{ env.GHCR_IMAGE }} + ${{ env.DOCKER_IMAGE }} tags: | type=sha,prefix=sha-,suffix=-${{ matrix.arch }} + - name: Cache-only smoke build + if: ${{ needs.mode.outputs.canary == 'true' }} + uses: useblacksmith/build-push-action@v2 + with: + context: . + platforms: ${{ matrix.platform }} + outputs: type=cacheonly + - name: Build and Push by Digest id: build - uses: docker/build-push-action@v7 + uses: useblacksmith/build-push-action@v2 with: context: . sbom: true @@ -104,8 +128,6 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} annotations: ${{ steps.meta.outputs.annotations }} - cache-from: type=gha,scope=${{ env.IMAGE }}-${{ matrix.arch }} - cache-to: type=gha,mode=max,scope=${{ env.IMAGE }}-${{ matrix.arch }} - name: Export digest run: | @@ -183,10 +205,11 @@ jobs: uses: docker/metadata-action@v6 with: images: | - ghcr.io/${{ env.IMAGE }} - docker.io/${{ env.IMAGE }} + ${{ env.GHCR_IMAGE }} + ${{ env.DOCKER_IMAGE }} tags: | type=sha,prefix=sha- + type=raw,value=canary-${{ github.run_id }}-${{ github.run_attempt }},enable=${{ needs.mode.outputs.canary == 'true' }} type=raw,value=nightly,enable=${{ needs.mode.outputs.nightly == 'true' }} type=raw,value=nightly-{{date 'YYYYMMDDHHmmss' tz='UTC'}},enable=${{ needs.mode.outputs.nightly == 'true' }} type=raw,value=latest,enable=${{ needs.mode.outputs.release == 'true' }} @@ -202,6 +225,8 @@ jobs: if [[ "${{ needs.mode.outputs.nightly }}" == "true" ]]; then FINAL_TAG="nightly" + elif [[ "${{ needs.mode.outputs.canary }}" == "true" ]]; then + FINAL_TAG="canary-${{ github.run_id }}-${{ github.run_attempt }}" else FINAL_TAG="v${{ steps.version.outputs.version }}" fi @@ -214,14 +239,13 @@ jobs: --annotation "index:org.opencontainers.image.vendor=Amruth Pillai" \ --annotation "index:org.opencontainers.image.url=https://rxresu.me" \ --annotation "index:org.opencontainers.image.documentation=https://docs.rxresu.me" \ - --annotation "index:org.opencontainers.image.source=https://github.com/amruthpillai/reactive-resume" \ + --annotation "index:org.opencontainers.image.source=https://github.com/${{ github.repository }}" \ --annotation "index:org.opencontainers.image.version=${{ steps.version.outputs.version }}" \ - $(printf 'ghcr.io/${{ env.IMAGE }}@sha256:%s ' *) \ - $(printf 'docker.io/${{ env.IMAGE }}@sha256:%s ' *) + $(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *) # Get the digest of the multi-arch manifest - GHCR_DIGEST=$(docker buildx imagetools inspect ghcr.io/${{ env.IMAGE }}:${FINAL_TAG} --format '{{json .Manifest.Digest}}' | tr -d '"') - DOCKER_DIGEST=$(docker buildx imagetools inspect docker.io/${{ env.IMAGE }}:${FINAL_TAG} --format '{{json .Manifest.Digest}}' | tr -d '"') + GHCR_DIGEST=$(docker buildx imagetools inspect ${{ env.GHCR_IMAGE }}:${FINAL_TAG} --format '{{json .Manifest.Digest}}' | tr -d '"') + DOCKER_DIGEST=$(docker buildx imagetools inspect ${{ env.DOCKER_IMAGE }}:${FINAL_TAG} --format '{{json .Manifest.Digest}}' | tr -d '"') echo "final_tag=$FINAL_TAG" >> "$GITHUB_OUTPUT" echo "ghcr_digest=$GHCR_DIGEST" >> "$GITHUB_OUTPUT" echo "docker_digest=$DOCKER_DIGEST" >> "$GITHUB_OUTPUT" @@ -232,15 +256,15 @@ jobs: - name: Sign images with Cosign run: | # Sign GHCR image - cosign sign --yes ghcr.io/${{ env.IMAGE }}@${{ steps.manifest.outputs.ghcr_digest }} + cosign sign --yes ${{ env.GHCR_IMAGE }}@${{ steps.manifest.outputs.ghcr_digest }} # Sign Docker Hub image - cosign sign --yes docker.io/${{ env.IMAGE }}@${{ steps.manifest.outputs.docker_digest }} + cosign sign --yes ${{ env.DOCKER_IMAGE }}@${{ steps.manifest.outputs.docker_digest }} - name: Inspect image run: | - docker buildx imagetools inspect ghcr.io/${{ env.IMAGE }}:${{ steps.manifest.outputs.final_tag }} - docker buildx imagetools inspect docker.io/${{ env.IMAGE }}:${{ steps.manifest.outputs.final_tag }} + docker buildx imagetools inspect ${{ env.GHCR_IMAGE }}:${{ steps.manifest.outputs.final_tag }} + docker buildx imagetools inspect ${{ env.DOCKER_IMAGE }}:${{ steps.manifest.outputs.final_tag }} - name: Redeploy Stack if: ${{ needs.mode.outputs.release == 'true' }} diff --git a/AGENTS.md b/AGENTS.md index ef79a60eb..11e1882fb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -31,7 +31,7 @@ Boundaries: code/commits/PRs written normal. ## Agent skills -- Issues and specs: GitHub Issues for `amruthpillai/reactive-resume`. See `docs/agents/issue-tracker.md`. +- Issues and specs: GitHub Issues for `reactive-resume/app`. See `docs/agents/issue-tracker.md`. - Domain docs use a multi-context layout. See `docs/agents/domain.md`. ## Overview diff --git a/Dockerfile b/Dockerfile index 27b894498..b99e6f022 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,7 +48,7 @@ LABEL org.opencontainers.image.description="A free and open-source resume builde LABEL org.opencontainers.image.vendor="Amruth Pillai" LABEL org.opencontainers.image.url="https://rxresu.me" LABEL org.opencontainers.image.documentation="https://docs.rxresu.me" -LABEL org.opencontainers.image.source="https://github.com/amruthpillai/reactive-resume" +LABEL org.opencontainers.image.source="https://github.com/reactive-resume/app" ENV NODE_ENV="production" \ PORT=3000 \ diff --git a/README.md b/README.md index b46fd6c68..b51951bfb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ > [!IMPORTANT] -> **Repository migration planned:** Reactive Resume is moving from `amruthpillai/reactive-resume` to **`reactive-resume/app`** on GitHub. +> **Repository moved:** Reactive Resume now lives at **[`reactive-resume/app`](https://github.com/reactive-resume/app)** on GitHub. > **Docker Hub stays at `amruthpillai/reactive-resume`.** The new GitHub Container Registry image will be `ghcr.io/reactive-resume/app`. -> Keep your current image configuration until availability is confirmed in the [pinned migration announcement](https://github.com/amruthpillai/reactive-resume/issues/3503). +> Keep your current image configuration until availability is confirmed in the [pinned migration announcement](https://github.com/reactive-resume/app/issues/3503). > GitHub Sponsors and Open Collective funding links remain unchanged.
@@ -20,9 +20,9 @@

- Reactive Resume Version - GitHub Stars - License + Reactive Resume Version + GitHub Stars + License Docker Pulls Discord Crowdin @@ -149,7 +149,7 @@ The quickest way to run Reactive Resume locally: ```bash # Clone the repository -git clone --depth=1 https://github.com/amruthpillai/reactive-resume.git +git clone --depth=1 https://github.com/reactive-resume/app.git reactive-resume cd reactive-resume # Start all services @@ -225,17 +225,17 @@ Other ways to support: - Star this repository - Report reproducible bugs and suggest actionable features -- Help other users in [GitHub Discussions](https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a) +- Help other users in [GitHub Discussions](https://github.com/reactive-resume/app/discussions/categories/q-a) - Improve documentation - Help with translations ## Star History - + - - - Star History Chart + + + Star History Chart @@ -251,7 +251,7 @@ Every contribution helps, whether it is a typo fix or a new feature. See the [development setup guide](https://docs.rxresu.me/contributing/development) for how to run 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) +Maintainers review the [`status: needs triage` queue](https://github.com/reactive-resume/app/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`. diff --git a/apps/server/src/openapi/generator.ts b/apps/server/src/openapi/generator.ts index 2b64864da..1253ea063 100644 --- a/apps/server/src/openapi/generator.ts +++ b/apps/server/src/openapi/generator.ts @@ -84,7 +84,7 @@ export async function generateOpenApiSpec({ appUrl, version }: GenerateOpenApiSp title: "Reactive Resume", version, description: "Reactive Resume API", - license: { name: "MIT", url: "https://github.com/amruthpillai/reactive-resume/blob/main/LICENSE" }, + license: { name: "MIT", url: "https://github.com/reactive-resume/app/blob/main/LICENSE" }, contact: { name: "Amruth Pillai", email: "hello@amruthpillai.com", url: "https://amruthpillai.com" }, }, servers: [{ url: `${appUrl}/api/openapi` }], diff --git a/apps/server/src/static/web.ts b/apps/server/src/static/web.ts index 92f99551d..c122cb398 100644 --- a/apps/server/src/static/web.ts +++ b/apps/server/src/static/web.ts @@ -127,13 +127,13 @@ function createRootSeoMarkup(canonicalUrl: string) { price: "0", priceCurrency: "USD", }, - codeRepository: "https://github.com/amruthpillai/reactive-resume", + codeRepository: "https://github.com/reactive-resume/app", }, { "@type": "Project", name: "Reactive Resume", url: canonicalUrl, - sameAs: ["https://github.com/amruthpillai/reactive-resume"], + sameAs: ["https://github.com/reactive-resume/app"], }, { "@type": "FAQPage", diff --git a/apps/web/public/funding.json b/apps/web/public/funding.json index 653ce4acf..1b1c2c82e 100644 --- a/apps/web/public/funding.json +++ b/apps/web/public/funding.json @@ -20,8 +20,8 @@ "url": "https://rxresu.me" }, "repositoryUrl": { - "url": "https://github.com/amruthpillai/reactive-resume", - "wellKnown": "https://github.com/amruthpillai/reactive-resume/blob/main/.github/.well-known/funding-manifest-urls" + "url": "https://github.com/reactive-resume/app", + "wellKnown": "https://github.com/reactive-resume/app/blob/main/.github/.well-known/funding-manifest-urls" }, "licenses": ["spdx:MIT"], "tags": ["data", "design", "productivity", "resume-builder"] diff --git a/apps/web/src/components/input/github-stars-button.test.tsx b/apps/web/src/components/input/github-stars-button.test.tsx index e526aa453..22332706c 100644 --- a/apps/web/src/components/input/github-stars-button.test.tsx +++ b/apps/web/src/components/input/github-stars-button.test.tsx @@ -42,7 +42,7 @@ describe("GithubStarsButton", () => { it("renders an anchor pointing at the project repo with rel=noopener noreferrer and target=_blank", () => { renderButton(); const link = screen.getByRole("button") as HTMLAnchorElement; - expect(link.href).toBe("https://github.com/amruthpillai/reactive-resume"); + expect(link.href).toBe("https://github.com/reactive-resume/app"); expect(link.target).toBe("_blank"); expect(link.rel).toBe("noopener noreferrer"); }); diff --git a/apps/web/src/components/input/github-stars-button.tsx b/apps/web/src/components/input/github-stars-button.tsx index 83aa67525..f9d8e80da 100644 --- a/apps/web/src/components/input/github-stars-button.tsx +++ b/apps/web/src/components/input/github-stars-button.tsx @@ -20,7 +20,7 @@ export function GithubStarsButton() { render={ diff --git a/apps/web/src/components/ui/copyright.test.tsx b/apps/web/src/components/ui/copyright.test.tsx index 6f8dd6e60..85f3c0211 100644 --- a/apps/web/src/components/ui/copyright.test.tsx +++ b/apps/web/src/components/ui/copyright.test.tsx @@ -24,7 +24,7 @@ describe("Copyright", () => { it("renders the MIT license link", () => { renderCopyright(); const link = screen.getByRole("link", { name: "MIT" }); - expect(link.getAttribute("href")).toBe("https://github.com/AmruthPillai/Reactive-Resume/blob/main/LICENSE"); + expect(link.getAttribute("href")).toBe("https://github.com/reactive-resume/app/blob/main/LICENSE"); expect(link.getAttribute("rel")).toBe("noopener noreferrer"); }); diff --git a/apps/web/src/components/ui/copyright.tsx b/apps/web/src/components/ui/copyright.tsx index 087f507ce..5e9159f0c 100644 --- a/apps/web/src/components/ui/copyright.tsx +++ b/apps/web/src/components/ui/copyright.tsx @@ -10,7 +10,7 @@ export function Copyright({ className, ...props }: Props) { Licensed under{" "} import("./export-playground")); const AtsPlayground = lazy(() => import("./ats-playground")); -const githubUrl = "https://github.com/amruthpillai/reactive-resume"; +const githubUrl = "https://github.com/reactive-resume/app"; const buttonClass = "inline-flex min-h-[52px] items-center justify-center gap-3 rounded-[4px] border border-[#f1f0eb] bg-[#f1f0eb] px-[19px] py-[14px] text-[14px] font-[550] text-[#151516] [transition:background-color_150ms_ease,transform_150ms_cubic-bezier(0.23,1,0.32,1)] hover:bg-[#d9d8d2] active:transform-[scale(0.97)] max-[540px]:min-h-[49px] max-[540px]:gap-[18px] max-[540px]:px-[15px] max-[540px]:py-3 max-[540px]:text-[13px]"; const brandClass = "inline-flex shrink-0 items-center gap-[11px] font-[550] tracking-[-0.04em] max-[540px]:gap-2"; diff --git a/apps/web/src/features/homepage/site-footer.tsx b/apps/web/src/features/homepage/site-footer.tsx index 7b88f6b1a..6e0af186f 100644 --- a/apps/web/src/features/homepage/site-footer.tsx +++ b/apps/web/src/features/homepage/site-footer.tsx @@ -14,7 +14,7 @@ import { m } from "motion/react"; import { cn } from "@reactive-resume/utils/style"; import { wrap } from "./classes"; -const githubUrl = "https://github.com/amruthpillai/reactive-resume"; +const githubUrl = "https://github.com/reactive-resume/app"; const licenseUrl = `${githubUrl}/blob/main/LICENSE`; type FooterLink = { label: string } & ( diff --git a/apps/web/src/libs/seo.ts b/apps/web/src/libs/seo.ts index 4773b23e5..a169f9711 100644 --- a/apps/web/src/libs/seo.ts +++ b/apps/web/src/libs/seo.ts @@ -1,6 +1,6 @@ const productionRootUrl = "https://rxresu.me/"; const appName = "Reactive Resume"; -const repositoryUrl = "https://github.com/amruthpillai/reactive-resume"; +const repositoryUrl = "https://github.com/reactive-resume/app"; type JsonLd = Record; diff --git a/apps/web/src/routes/_home/-sections/footer.test.tsx b/apps/web/src/routes/_home/-sections/footer.test.tsx index c0b9d96de..bf72bcb37 100644 --- a/apps/web/src/routes/_home/-sections/footer.test.tsx +++ b/apps/web/src/routes/_home/-sections/footer.test.tsx @@ -47,7 +47,7 @@ describe("Footer", () => { it("renders social media icon links to GitHub, LinkedIn, and X", () => { const { container } = renderFooter(); const hrefs = Array.from(container.querySelectorAll("a")).map((a) => a.href); - expect(hrefs.some((h) => h.includes("github.com/amruthpillai/reactive-resume"))).toBe(true); + expect(hrefs.some((h) => h.includes("github.com/reactive-resume/app"))).toBe(true); expect(hrefs.some((h) => h.includes("linkedin.com/in/amruthpillai"))).toBe(true); expect(hrefs.some((h) => h.includes("x.com/KingOKings"))).toBe(true); }); diff --git a/apps/web/src/routes/_home/-sections/footer.tsx b/apps/web/src/routes/_home/-sections/footer.tsx index d2f99334e..10a0adf93 100644 --- a/apps/web/src/routes/_home/-sections/footer.tsx +++ b/apps/web/src/routes/_home/-sections/footer.tsx @@ -27,19 +27,19 @@ type SocialLink = { const getResourceLinks = (): FooterLinkItem[] => [ { url: "https://docs.rxresu.me", label: t`Documentation` }, { url: "https://opencollective.com/reactive-resume/donate", label: t`Sponsorships` }, - { url: "https://github.com/amruthpillai/reactive-resume", label: t`Source Code` }, + { url: "https://github.com/reactive-resume/app", label: t`Source Code` }, { url: "https://docs.rxresu.me/changelog", label: t`Changelog` }, ]; const getCommunityLinks = (): FooterLinkItem[] => [ - { url: "https://github.com/amruthpillai/reactive-resume/issues", label: t`Report an issue` }, + { url: "https://github.com/reactive-resume/app/issues", label: t`Report an issue` }, { url: "https://crowdin.com/project/reactive-resume", label: t`Translations` }, { url: "https://reddit.com/r/reactiveresume", label: t`Subreddit` }, { url: "https://discord.gg/aSyA5ZSxpb", label: t`Discord` }, ]; const socialLinks: SocialLink[] = [ - { url: "https://github.com/amruthpillai/reactive-resume", label: t`GitHub`, icon: GithubLogoIcon }, + { url: "https://github.com/reactive-resume/app", label: t`GitHub`, icon: GithubLogoIcon }, { url: "https://linkedin.com/in/amruthpillai", label: t`LinkedIn`, icon: LinkedinLogoIcon }, { url: "https://x.com/KingOKings", label: t`X (Twitter)`, icon: XLogoIcon }, ]; diff --git a/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/information.tsx b/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/information.tsx index 04f2b5fae..fc8b061a6 100644 --- a/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/information.tsx +++ b/apps/web/src/routes/builder/$resumeId/-sidebar/right/sections/information.tsx @@ -59,7 +59,7 @@ export function InformationSectionBuilder() { className="text-xs" nativeButton={false} render={ - + Source Code } @@ -71,7 +71,7 @@ export function InformationSectionBuilder() { className="text-xs" nativeButton={false} render={ - + Report a Bug } diff --git a/docs/contributing/development.mdx b/docs/contributing/development.mdx index 58c580335..cdf81c04d 100644 --- a/docs/contributing/development.mdx +++ b/docs/contributing/development.mdx @@ -17,7 +17,7 @@ These steps set up Reactive Resume for local development, whether you're contrib ```bash - git clone https://github.com/amruthpillai/reactive-resume.git + git clone https://github.com/reactive-resume/app.git reactive-resume cd reactive-resume ``` @@ -318,7 +318,7 @@ pnpm run typecheck How the project and codebase are structured. - + View the source code and contribute to the project. diff --git a/docs/contributing/translations.mdx b/docs/contributing/translations.mdx index 89e5fcfd3..547037bcf 100644 --- a/docs/contributing/translations.mdx +++ b/docs/contributing/translations.mdx @@ -106,7 +106,7 @@ If your language is not listed in the Crowdin project, you can request it to be To request a new language: -1. Go to the [GitHub Issues](https://github.com/amruthpillai/reactive-resume/issues) page +1. Go to the [GitHub Issues](https://github.com/reactive-resume/app/issues) page 2. Click **New Issue** 3. Select the appropriate template or create a blank issue 4. Title it something like: "Add [Language Name] to Reactive Resume" @@ -152,7 +152,7 @@ Translations submitted on Crowdin are synced to the codebase periodically. Once Official Crowdin documentation for translators. - + Report issues or request new languages. diff --git a/docs/docs.json b/docs/docs.json index d14add7de..8488f81e8 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -177,7 +177,7 @@ { "icon": "github", "anchor": "Source Code", - "href": "https://github.com/amruthpillai/reactive-resume" + "href": "https://github.com/reactive-resume/app" } ] } @@ -190,7 +190,7 @@ "links": [ { "label": "Support", - "href": "https://github.com/amruthpillai/reactive-resume/issues" + "href": "https://github.com/reactive-resume/app/issues" } ], "primary": { @@ -205,7 +205,7 @@ "footer": { "socials": { "website": "https://rxresu.me", - "github": "https://github.com/amruthpillai/reactive-resume" + "github": "https://github.com/reactive-resume/app" } } } diff --git a/docs/getting-started.mdx b/docs/getting-started.mdx index 16791a415..379099aa7 100644 --- a/docs/getting-started.mdx +++ b/docs/getting-started.mdx @@ -35,7 +35,7 @@ Reactive Resume is a free and open-source resume builder that makes it easy to c Reactive Resume is licensed under MIT. You can use it for free, modify it, and even host your own instance. The - entire codebase is available on [GitHub](https://github.com/amruthpillai/reactive-resume). + entire codebase is available on [GitHub](https://github.com/reactive-resume/app). @@ -91,10 +91,10 @@ Use the hosted version, or run your own instance. ## Community & support - + Star the repo, report reproducible bugs, propose features, and contribute to the project. - + Ask questions about setup, configuration, and using Reactive Resume. @@ -109,6 +109,6 @@ Use the hosted version, or run your own instance. - **Need help?** Start a [GitHub Discussion](https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a). + **Need help?** Start a [GitHub Discussion](https://github.com/reactive-resume/app/discussions/categories/q-a). GitHub Issues are reserved for reproducible bugs and actionable feature proposals. diff --git a/docs/getting-started/quickstart.mdx b/docs/getting-started/quickstart.mdx index 4e4bb9041..529d74bd5 100644 --- a/docs/getting-started/quickstart.mdx +++ b/docs/getting-started/quickstart.mdx @@ -72,7 +72,7 @@ Before you begin, ensure you have the following installed: ```bash - git clone https://github.com/amruthpillai/reactive-resume.git + git clone https://github.com/reactive-resume/app.git reactive-resume cd reactive-resume ``` @@ -232,6 +232,6 @@ A complete list of the environment variables you can configure: - **Having trouble?** Check our [GitHub Issues](https://github.com/amruthpillai/reactive-resume/issues) or reach out via + **Having trouble?** Check our [GitHub Issues](https://github.com/reactive-resume/app/issues) or reach out via [email](mailto:hello@amruthpillai.com). diff --git a/docs/guides/accessing-the-previous-version.mdx b/docs/guides/accessing-the-previous-version.mdx index 63b1bb6e9..886134833 100644 --- a/docs/guides/accessing-the-previous-version.mdx +++ b/docs/guides/accessing-the-previous-version.mdx @@ -77,4 +77,4 @@ problem. That requires a separate session, create, list, and reload diagnosis; a ## Questions or issues? -If you run into problems accessing v4, or have questions about migrating your resumes, open an issue on [GitHub](https://github.com/amruthpillai/reactive-resume/issues). +If you run into problems accessing v4, or have questions about migrating your resumes, open an issue on [GitHub](https://github.com/reactive-resume/app/issues). diff --git a/docs/guides/checking-service-status.mdx b/docs/guides/checking-service-status.mdx index 4407b36f8..8e83accd3 100644 --- a/docs/guides/checking-service-status.mdx +++ b/docs/guides/checking-service-status.mdx @@ -39,7 +39,7 @@ If the servers are under high load or unreachable: - For major outages or planned maintenance, announcements may be posted on our [GitHub repository](https://github.com/amruthpillai/reactive-resume). + For major outages or planned maintenance, announcements may be posted on our [GitHub repository](https://github.com/reactive-resume/app). diff --git a/docs/legal/license.mdx b/docs/legal/license.mdx index 30201a658..babc7219e 100644 --- a/docs/legal/license.mdx +++ b/docs/legal/license.mdx @@ -9,7 +9,7 @@ Reactive Resume is open-source software. The project is published under the **MI If you are running a modified/self-hosted instance, you may have additional notices or third-party licenses that apply (for example, fonts, icons, or other bundled assets). -For the upstream repository, see: [amruthpillai/reactive-resume](https://github.com/amruthpillai/reactive-resume) +For the upstream repository, see: [reactive-resume/app](https://github.com/reactive-resume/app) --- diff --git a/docs/self-hosting/examples.mdx b/docs/self-hosting/examples.mdx index 82259f950..625095f47 100644 --- a/docs/self-hosting/examples.mdx +++ b/docs/self-hosting/examples.mdx @@ -15,7 +15,7 @@ They go further than the basic setup in the [Self-hosting with Docker](/self-hos **Share your setup.** If you have a working configuration that isn't covered here, I'd love to include it. [Open a - pull request](https://github.com/amruthpillai/reactive-resume) with your example added to this page. + pull request](https://github.com/reactive-resume/app) with your example added to this page. --- @@ -457,7 +457,7 @@ Have a different deployment setup that works well? Consider contributing it here - Podman configurations - Cloud-specific deployments (AWS ECS, Google Cloud Run, Azure Container Apps) -To contribute, [open a pull request](https://github.com/amruthpillai/reactive-resume) with your example added to this page. Include: +To contribute, [open a pull request](https://github.com/reactive-resume/app) with your example added to this page. Include: 1. A brief description of when/why someone would use this setup 2. The complete Docker Compose (or equivalent) configuration diff --git a/docs/self-hosting/migration.mdx b/docs/self-hosting/migration.mdx index 60ea8a84d..9590a8bac 100644 --- a/docs/self-hosting/migration.mdx +++ b/docs/self-hosting/migration.mdx @@ -150,7 +150,7 @@ To run the migration scripts, you need the following installed on your host mach Clone the Reactive Resume repository and check out the last tag that includes the migration scripts: ```bash - git clone https://github.com/amruthpillai/reactive-resume.git + git clone https://github.com/reactive-resume/app.git reactive-resume cd reactive-resume git checkout tags/v5.0.20 pnpm install diff --git a/docs/spec.json b/docs/spec.json index 900649b3a..232066a20 100644 --- a/docs/spec.json +++ b/docs/spec.json @@ -5,7 +5,7 @@ "description": "Reactive Resume API", "license": { "name": "MIT", - "url": "https://github.com/amruthpillai/reactive-resume/blob/main/LICENSE" + "url": "https://github.com/reactive-resume/app/blob/main/LICENSE" }, "contact": { "name": "Amruth Pillai", diff --git a/docs/use-cases/free-resume-builder.mdx b/docs/use-cases/free-resume-builder.mdx index 32a4fbe94..d79bcbd59 100644 --- a/docs/use-cases/free-resume-builder.mdx +++ b/docs/use-cases/free-resume-builder.mdx @@ -50,7 +50,7 @@ Open [rxresu.me](https://rxresu.me) to create a resume, or follow [Creating your Open the official Reactive Resume instance. - + View the project repository. diff --git a/docs/use-cases/open-source-resume-builder.mdx b/docs/use-cases/open-source-resume-builder.mdx index 84814b171..3405c403f 100644 --- a/docs/use-cases/open-source-resume-builder.mdx +++ b/docs/use-cases/open-source-resume-builder.mdx @@ -7,7 +7,7 @@ Reactive Resume is an open-source resume builder. The source code is public, the ## What open source means here -The project repository is on [GitHub](https://github.com/amruthpillai/reactive-resume). You can read the code, report issues, contribute improvements, and see how the builder, the API, the self-hosting setup, and the documentation are put together. +The project repository is on [GitHub](https://github.com/reactive-resume/app). You can read the code, report issues, contribute improvements, and see how the builder, the API, the self-hosting setup, and the documentation are put together. The license is documented in [License](/legal/license). @@ -44,7 +44,7 @@ To contribute or to understand the codebase, start with the contributor docs. Th Help translate the app. - + Browse issues, pull requests, and source code. diff --git a/docs/use-cases/privacy-focused-resume-builder.mdx b/docs/use-cases/privacy-focused-resume-builder.mdx index ed2bb23d1..bd0da2693 100644 --- a/docs/use-cases/privacy-focused-resume-builder.mdx +++ b/docs/use-cases/privacy-focused-resume-builder.mdx @@ -21,7 +21,7 @@ Do not treat public sharing as access control. Use password protection, or keep ## Open source and self-hosting -The source code is on [GitHub](https://github.com/amruthpillai/reactive-resume), so you can read how the application works. If you need direct control over infrastructure, storage, auth providers, and deployment policy, run your own instance. +The source code is on [GitHub](https://github.com/reactive-resume/app), so you can read how the application works. If you need direct control over infrastructure, storage, auth providers, and deployment policy, run your own instance. Start with: diff --git a/package.json b/package.json index d4de1e51a..6190ad5ee 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/amruthpillai/reactive-resume.git" + "url": "https://github.com/reactive-resume/app.git" }, "engines": { "node": ">=24" diff --git a/packages/api/src/features/statistics/service.ts b/packages/api/src/features/statistics/service.ts index 6f233d1df..d0425f193 100644 --- a/packages/api/src/features/statistics/service.ts +++ b/packages/api/src/features/statistics/service.ts @@ -3,7 +3,7 @@ import { db } from "@reactive-resume/db/client"; import * as schema from "@reactive-resume/db/schema"; const CACHE_DURATION_MS = 6 * 60 * 60 * 1000; // 6 hours -const GITHUB_API_URL = "https://api.github.com/repos/amruthpillai/reactive-resume"; +const GITHUB_API_URL = "https://api.github.com/repos/reactive-resume/app"; const GITHUB_REQUEST_TIMEOUT_MS = 5_000; const GITHUB_REQUEST_MAX_ATTEMPTS = 2; diff --git a/packages/dsh-plugin/README.md b/packages/dsh-plugin/README.md index 6a591c13c..c13c741e2 100644 --- a/packages/dsh-plugin/README.md +++ b/packages/dsh-plugin/README.md @@ -48,7 +48,7 @@ You could wire the bridge yourself with a raw `@deepseek-ai/dsh-mcp-client` row. ## Development -This package lives in the [Reactive Resume monorepo](https://github.com/amruthpillai/reactive-resume) at `packages/dsh-plugin`, next to `packages/mcp` — the server it bridges. `src/tool-names.test.ts` checks every tool the prompt guide names against `@reactive-resume/mcp/tool-names`, so renaming a tool breaks this package in the same pull request. +This package lives in the [Reactive Resume monorepo](https://github.com/reactive-resume/app) at `packages/dsh-plugin`, next to `packages/mcp` — the server it bridges. `src/tool-names.test.ts` checks every tool the prompt guide names against `@reactive-resume/mcp/tool-names`, so renaming a tool breaks this package in the same pull request. ```bash pnpm --filter dsh-plugin-reactive-resume test diff --git a/packages/dsh-plugin/package.json b/packages/dsh-plugin/package.json index d0504b0b6..917f12b51 100644 --- a/packages/dsh-plugin/package.json +++ b/packages/dsh-plugin/package.json @@ -13,12 +13,12 @@ "author": "Amruth Pillai", "repository": { "type": "git", - "url": "git+https://github.com/amruthpillai/reactive-resume.git", + "url": "git+https://github.com/reactive-resume/app.git", "directory": "packages/dsh-plugin" }, - "homepage": "https://github.com/amruthpillai/reactive-resume/tree/main/packages/dsh-plugin#readme", + "homepage": "https://github.com/reactive-resume/app/tree/main/packages/dsh-plugin#readme", "bugs": { - "url": "https://github.com/amruthpillai/reactive-resume/issues" + "url": "https://github.com/reactive-resume/app/issues" }, "type": "module", "main": "dist/index.js", diff --git a/server.json b/server.json index 894e418f4..4caefa2a8 100644 --- a/server.json +++ b/server.json @@ -5,7 +5,7 @@ "description": "Free open-source resume builder with remote MCP tools for resumes and job applications.", "websiteUrl": "https://rxresu.me", "repository": { - "url": "https://github.com/amruthpillai/reactive-resume", + "url": "https://github.com/reactive-resume/app", "source": "github" }, "version": "5.2.2", diff --git a/tooling/docker-publishing.test.ts b/tooling/docker-publishing.test.ts new file mode 100644 index 000000000..67eb52a92 --- /dev/null +++ b/tooling/docker-publishing.test.ts @@ -0,0 +1,40 @@ +import { execFileSync } from "node:child_process"; +import { mkdtempSync, readFileSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { expect, it } from "vitest"; + +it("keeps smoke dispatches out of release publishing and production deployment", () => { + const workflow = readFileSync(new URL("../.github/workflows/docker-build.yml", import.meta.url), "utf8"); + const mode = workflow.match(/ {8}run: \|\n([\s\S]*?)\n {2}build:/)?.[1]; + if (!mode) throw new Error("Publishing mode script is missing"); + const directory = mkdtempSync(join(tmpdir(), "docker-publishing-")); + + try { + for (const [event, ref, release, expected] of [ + ["push", "refs/heads/main", "", "nightly"], + ["push", "refs/tags/v5.3.0", "", "release"], + ["workflow_dispatch", "refs/heads/main", "", "canary"], + ["workflow_dispatch", "refs/heads/main", "false", "canary"], + ["workflow_dispatch", "refs/heads/main", "true", "release"], + ]) { + const output = join(directory, `${event}-${release || "default"}-${expected}`); + execFileSync("bash", ["-eu", "-c", mode], { + env: { ...process.env, EVENT_NAME: event, GIT_REF: ref, RELEASE: release, GITHUB_OUTPUT: output }, + }); + const values = Object.fromEntries( + readFileSync(output, "utf8") + .trim() + .split("\n") + .map((line) => line.split("=")), + ); + expect(values).toEqual({ + nightly: String(expected === "nightly"), + release: String(expected === "release"), + canary: String(expected === "canary"), + }); + } + } finally { + rmSync(directory, { recursive: true, force: true }); + } +});