diff --git a/.agents/skills/1-topic-research/SKILL.md b/.agents/skills/1-topic-research/SKILL.md index 1b5d2a47..ad49c98c 100644 --- a/.agents/skills/1-topic-research/SKILL.md +++ b/.agents/skills/1-topic-research/SKILL.md @@ -19,9 +19,9 @@ description: "Phase 1 of the SEO article pipeline: Topic Research & Validation. - The user asks "should I write about X?" or "is this keyword worth targeting?" - Before ANY blog article is drafted — this phase is mandatory -## Context: Applirank & The Content Strategy +## Context: Reqcore & The Content Strategy -**Applirank** is an open-source applicant tracking system (ATS). We are executing a topical authority SEO strategy with ~132 planned articles across 9 clusters (see `TOPICAL-AUTHORITY-MAP.md`). We publish one AI-assisted article per day on `applirank.com/blog`. Content lives in `content/blog/*.md` files using `@nuxt/content` v3. +**Reqcore** is an open-source applicant tracking system (ATS). We are executing a topical authority SEO strategy with ~132 planned articles across 9 clusters (see `TOPICAL-AUTHORITY-MAP.md`). We publish one AI-assisted article per day on `reqcore.com/blog`. Content lives in `content/blog/*.md` files using `@nuxt/content` v3. **Primary audiences:** 1. Technical recruiters & hiring managers evaluating ATS tools @@ -44,7 +44,7 @@ description: "Phase 1 of the SEO article pipeline: Topic Research & Validation. Take the topic from the topical authority map and determine the best **primary keyword** to target. The primary keyword should be: - The most natural, commonly-searched phrasing of this topic -- Relevant to Applirank's audience (recruiters, HR teams, developers, founders) +- Relevant to Reqcore's audience (recruiters, HR teams, developers, founders) - Specific enough to have clear search intent (avoid overly broad terms) **How to validate:** Use `fetch_webpage` to search Google for the candidate keyword. Analyze the top 10 results: @@ -95,7 +95,7 @@ Long-tail pivot (if needed): [alternative keyword] Search the primary keyword and classify intent based on what **dominates page 1**: -| Intent | SERP Signals | Applirank Action | +| Intent | SERP Signals | Reqcore Action | |--------|-------------|------------------| | **Informational** | Guides, explainers, how-tos, Wikipedia, blog posts | Write a blog article (guide, explainer, how-to) | | **Commercial Investigation** | "Best X", comparison posts, review roundups, listicles | Write a blog article (comparison, roundup, listicle) | @@ -224,7 +224,7 @@ Competitor weaknesses: [bulleted list] | Source | How to Use It | Example | |--------|--------------|---------| -| **Builder experience** | Reference real decisions, trade-offs, and code from building Applirank | "When we built our pipeline Kanban board, we found that..." | +| **Builder experience** | Reference real decisions, trade-offs, and code from building Reqcore | "When we built our pipeline Kanban board, we found that..." | | **Review data analysis** | Analyze G2/Capterra review patterns to surface real user pain points | "Across 200+ G2 reviews of [Competitor], 34% mention data export frustration" | | **Contrarian opinion** | Challenge conventional wisdom with evidence | "Most 'best ATS' lists rank by feature count — but features you'll never use are anti-features" | | **Original data / cost analysis** | Calculate real numbers nobody else has published | "We calculated the 3-year total cost for self-hosted vs cloud ATS for a 20-person team" | @@ -305,15 +305,15 @@ Incoming links (existing → new article, for Phase 6): ### Step 7: Business Potential Scoring -**Goal:** Score the topic's alignment with Applirank's business goals. +**Goal:** Score the topic's alignment with Reqcore's business goals. #### 7.1 Scoring Rubric | Score | Criteria | Examples | |-------|----------|---------| -| **3 — High** | Applirank is a natural, irreplaceable solution to the searcher's problem. The article can organically feature Applirank as a recommendation. | ATS comparisons ("Best open-source ATS"), ATS selection guides, deployment tutorials, data ownership articles, self-hosting guides | -| **2 — Medium** | Applirank can be mentioned naturally as one relevant example, but the article isn't *about* Applirank. Brand mention feels authentic but not central. | AI in hiring, recruiting metrics, compliance guides, hiring workflow best practices, vendor lock-in discussions | -| **1 — Low** | Applirank mention would feel forced or tangential. The topic doesn't naturally connect to ATS software. | Generic remote work trends, general career advice, HR leadership philosophy, interview tips for candidates | +| **3 — High** | Reqcore is a natural, irreplaceable solution to the searcher's problem. The article can organically feature Reqcore as a recommendation. | ATS comparisons ("Best open-source ATS"), ATS selection guides, deployment tutorials, data ownership articles, self-hosting guides | +| **2 — Medium** | Reqcore can be mentioned naturally as one relevant example, but the article isn't *about* Reqcore. Brand mention feels authentic but not central. | AI in hiring, recruiting metrics, compliance guides, hiring workflow best practices, vendor lock-in discussions | +| **1 — Low** | Reqcore mention would feel forced or tangential. The topic doesn't naturally connect to ATS software. | Generic remote work trends, general career advice, HR leadership philosophy, interview tips for candidates | #### 7.2 Decision Gate @@ -326,8 +326,8 @@ Incoming links (existing → new article, for Phase 6): **Output for this step:** ``` Business potential: 3 / 2 / 1 -Justification: [How Applirank connects to this topic] -CTA recommendation: [What Applirank CTA fits naturally — e.g., "Try the live demo", "See our transparent AI scoring", "Deploy with Docker in 5 minutes"] +Justification: [How Reqcore connects to this topic] +CTA recommendation: [What Reqcore CTA fits naturally — e.g., "Try the live demo", "See our transparent AI scoring", "Deploy with Docker in 5 minutes"] ``` --- @@ -427,7 +427,7 @@ After completing all 7 steps, compile the results into this structured brief. Th | Field | Value | |-------|-------| | Score | 3 / 2 / 1 | -| Justification | [How Applirank connects] | +| Justification | [How Reqcore connects] | | CTA recommendation | [Natural CTA for this article] | ## 8. Recommended Article Specifications @@ -500,7 +500,7 @@ For original angles based on review data: **Do NOT proceed to Phase 2 if any of these are true:** -1. **Business potential = 1** — The topic has no natural connection to Applirank. Recommend a different topic. +1. **Business potential = 1** — The topic has no natural connection to Reqcore. Recommend a different topic. 2. **High cannibalization with no resolution** — An existing article already targets this keyword and intent, and there's no way to differentiate. Recommend expanding the existing article instead. 3. **No original angles found** — If all top-10 results already cover the topic comprehensively and you cannot identify at least 2 unique angles, the article will be a "me too" post. Recommend a long-tail pivot or different topic. 4. **Transactional intent** — The keyword triggers product/pricing pages, not blog content. Flag for the product team as a landing page opportunity. diff --git a/.agents/skills/2-source-gathering/SKILL.md b/.agents/skills/2-source-gathering/SKILL.md index 2c943dc6..5a306bfc 100644 --- a/.agents/skills/2-source-gathering/SKILL.md +++ b/.agents/skills/2-source-gathering/SKILL.md @@ -64,14 +64,14 @@ Never use full names unless publicly attributed. Use: platform, role, and compan ### Step 3: Builder Experience Notes -**When:** The topic relates to something built or decided in Applirank. -**Skip if:** The topic has no connection to Applirank's technical implementation. +**When:** The topic relates to something built or decided in Reqcore. +**Skip if:** The topic has no connection to Reqcore's technical implementation. Prompt the human with these specific questions: 1. **"What's one technical decision you made related to this topic, and why?"** (e.g., "I chose Drizzle ORM over Prisma because...") 2. **"What problem did you encounter building this, and how did you solve it?"** -3. **"Do you have a number or data point from Applirank's development?"** (processing time, architecture choice, lines of code, deployment metric) +3. **"Do you have a number or data point from Reqcore's development?"** (processing time, architecture choice, lines of code, deployment metric) 4. **"What's one thing you learned building this that most people get wrong?"** 5. **"Do you hold an opinion based on building experience that goes against conventional wisdom?"** @@ -156,7 +156,7 @@ Compile all gathered materials into this structured format. --- -## 3. Builder Experience (Applirank) +## 3. Builder Experience (Reqcore) - [specific experience, decision, or insight relevant to this topic] - [technical detail or data point from development] diff --git a/.agents/skills/4-technical-seo/SKILL.md b/.agents/skills/4-technical-seo/SKILL.md index 7df64f92..3e01b4b3 100644 --- a/.agents/skills/4-technical-seo/SKILL.md +++ b/.agents/skills/4-technical-seo/SKILL.md @@ -39,7 +39,7 @@ Run each check sequentially. Record ✅ (pass), ❌ (fail), or ⚠️ (acceptabl | # | Check | Rule | |---|-------|------| -| 1.1 | Character count | 50–60 chars (account for ` — Applirank` suffix = ~12 extra chars, so frontmatter title should be 50–60 chars) | +| 1.1 | Character count | 50–60 chars (account for ` — Reqcore` suffix = ~12 extra chars, so frontmatter title should be 50–60 chars) | | 1.2 | Keyword position | Primary keyword within the first 5 words | | 1.3 | Modifier present | Includes a compelling modifier: guide, comparison, number, year, checklist, breakdown, etc. | | 1.4 | Differentiation | Does NOT duplicate the phrasing of likely competitor titles found in the Phase 1 brief | @@ -144,13 +144,13 @@ useSchemaOrg([ author: { '@type': 'Person', name: 'Joachim', - url: 'https://applirank.com', + url: 'https://reqcore.com', }, image: post.value.image || '/og-image.png', publisher: { '@type': 'Organization', - name: 'Applirank', - url: 'https://applirank.com', + name: 'Reqcore', + url: 'https://reqcore.com', }, }), ]) diff --git a/.agents/skills/5-review-quality/SKILL.md b/.agents/skills/5-review-quality/SKILL.md index d698935b..540f8231 100644 --- a/.agents/skills/5-review-quality/SKILL.md +++ b/.agents/skills/5-review-quality/SKILL.md @@ -67,7 +67,7 @@ Read the intro aloud. If it sounds like a language model, rewrite it. Identify **2–3 specific locations** (by section heading) where the human must add: -- [ ] A sentence grounded in **builder experience** (building Applirank — architecture decision, tradeoff, lesson learned) +- [ ] A sentence grounded in **builder experience** (building Reqcore — architecture decision, tradeoff, lesson learned) - [ ] A **specific detail only the author would know** (user feedback, support conversation, metric, failed experiment) - [ ] A **genuine opinion** the AI could not have generated (a recommendation, a warning, a preference with reasoning) diff --git a/.agents/skills/seo-skill/SKILL.md b/.agents/skills/seo-skill/SKILL.md index f9da4aa5..38a88cb0 100644 --- a/.agents/skills/seo-skill/SKILL.md +++ b/.agents/skills/seo-skill/SKILL.md @@ -5,7 +5,7 @@ description: Organic SEO optimization for blog articles, landing pages, and publ # SEO Skill — Maximize Organic Search Ranking & AI Visibility -This skill provides actionable rules for writing and optimizing content that ranks at the top of Google Search and gets cited by AI assistants. Every rule is grounded in Google's official documentation, industry-leading SEO research (Ahrefs, Backlinko), and adapted to the Applirank tech stack (`@nuxt/content` v3, `@nuxtjs/seo`, Nuxt 4). +This skill provides actionable rules for writing and optimizing content that ranks at the top of Google Search and gets cited by AI assistants. Every rule is grounded in Google's official documentation, industry-leading SEO research (Ahrefs, Backlinko), and adapted to the Reqcore tech stack (`@nuxt/content` v3, `@nuxtjs/seo`, Nuxt 4). **When to use this skill:** - Writing or reviewing blog articles (`content/blog/*.md`) @@ -20,7 +20,7 @@ This skill provides actionable rules for writing and optimizing content that ran ### 1.1 Target One Primary Keyword Per Article - Every article targets **one** primary keyword (e.g., "self-hosted ATS", "open-source applicant tracking system"). -- The primary keyword should have search volume, be relevant to Applirank's audience (recruiters, HR teams, CTOs), and have realistic ranking difficulty. +- The primary keyword should have search volume, be relevant to Reqcore's audience (recruiters, HR teams, CTOs), and have realistic ranking difficulty. - Use long-tail variants to capture specific search queries (e.g., "self-hosted ATS vs cloud ATS comparison"). ### 1.2 Match Search Intent @@ -31,9 +31,9 @@ Before writing, search the primary keyword on Google and analyze the top 10 resu - Match the **content format** (guide, listicle, comparison, how-to) that dominates page 1 ### 1.3 Business Potential Score -Prioritize topics where Applirank can be naturally mentioned as a solution. Rank topics 1–3: -- **3 (High)**: Applirank is an irreplaceable solution (e.g., "best open-source ATS") -- **2 (Medium)**: Applirank can be mentioned naturally (e.g., "ATS data ownership guide") +Prioritize topics where Reqcore can be naturally mentioned as a solution. Rank topics 1–3: +- **3 (High)**: Reqcore is an irreplaceable solution (e.g., "best open-source ATS") +- **2 (Medium)**: Reqcore can be mentioned naturally (e.g., "ATS data ownership guide") - **1 (Low)**: Tangential topic, brand mention feels forced (e.g., "remote work trends") Focus on topics scoring 2–3. @@ -49,7 +49,7 @@ Every blog post in `content/blog/*.md` MUST include complete frontmatter: title: "Primary Keyword — Compelling Modifier | Brand Context" description: "A 120–155 character meta description that includes the primary keyword, communicates value, and uses active voice." date: 2026-02-22 -author: "Applirank Team" +author: "Reqcore Team" image: "/og-image.png" tags: ["primary-keyword", "related-term-1", "related-term-2", "ats", "recruitment"] --- @@ -62,7 +62,7 @@ tags: ["primary-keyword", "related-term-1", "related-term-2", "ats", "recruitmen | `title` | 50–60 characters. Include primary keyword near the front. Use a compelling modifier (e.g., "Definitive Guide", "Practical Comparison", number). Avoid clickbait. | | `description` | 120–155 characters. Expand on the title with additional value. Include primary keyword. Use active voice. Address the searcher directly. | | `date` | ISO date format (YYYY-MM-DD). Must reflect actual publish or substantial update date. Never backdate for freshness illusion. | -| `author` | Real person name preferred for E-E-A-T. "Applirank Team" acceptable for team-authored content. | +| `author` | Real person name preferred for E-E-A-T. "Reqcore Team" acceptable for team-authored content. | | `image` | Path to a representative OG image. Use article-specific images when possible (minimum 1200×630px). | | `tags` | 3–7 lowercase tags. Include primary keyword, topical category, and 2–3 related terms. | @@ -80,7 +80,7 @@ The title tag is the single most impactful on-page SEO element. It directly infl 5. **Stand out from competitors** — scan SERP titles and differentiate 6. **Use positive emotion** — modifiers like "Practical", "Complete", "Essential" perform well. Avoid "insane", "unbelievable" (clickbait penalty) 7. **Add the current year** only for topics that demand freshness (e.g., "Best ATS 2026") — do NOT put the year in the URL slug -8. **Nuxt title template**: The `nuxt.config.ts` appends ` — Applirank` via `titleTemplate: '%s — Applirank'`. Account for this in total character count (~12 extra chars). Set the title via `useSeoMeta({ title: '...' })`, not `useHead({ title: '...' })` +8. **Nuxt title template**: The `nuxt.config.ts` appends ` — Reqcore` via `titleTemplate: '%s — Reqcore'`. Account for this in total character count (~12 extra chars). Set the title via `useSeoMeta({ title: '...' })`, not `useHead({ title: '...' })` ### Title Formulas That Work - `[Primary Keyword]: [Benefit or Outcome]` → "Self-Hosted ATS: Full Data Ownership Without the SaaS Tax" @@ -121,7 +121,7 @@ URLs are a lightweight ranking factor and a strong user trust signal. 3. **Never include dates in slugs** — content should be updatable without changing the URL 4. **Use lowercase, hyphens only** — no underscores, no uppercase, no special characters 5. **No trailing slashes** in links -6. In Applirank, blog URLs are derived from the filename: `content/blog/self-hosted-vs-cloud-ats.md` → `/blog/self-hosted-vs-cloud-ats` +6. In Reqcore, blog URLs are derived from the filename: `content/blog/self-hosted-vs-cloud-ats.md` → `/blog/self-hosted-vs-cloud-ats` ### Good vs Bad URLs ``` @@ -220,12 +220,12 @@ Google's quality rater guidelines prioritize E-E-A-T. While not a direct ranking - **Author byline** with real name when possible - Link to author bio or about page (currently `/` or a dedicated team page) - Show **first-hand experience**: reference actual product usage, real data, real workflows -- For Applirank content: include screenshots, code snippets, or configuration examples that prove familiarity +- For Reqcore content: include screenshots, code snippets, or configuration examples that prove familiarity - **Cite authoritative sources**: link to Google documentation, industry reports, credible studies ### 8.2 Build Authoritativeness - **Include original data or analysis** — cost comparisons, feature matrices, benchmarks that nobody else has -- **Reference Applirank's own product** as a case study when relevant +- **Reference Reqcore's own product** as a case study when relevant - **Expert quotes** for topics outside direct expertise (e.g., legal compliance, privacy law) - Consistently publish on your core topic (ATS, recruitment, hiring tech) to build topical authority @@ -282,7 +282,7 @@ Google's quality rater guidelines prioritize E-E-A-T. While not a direct ranking ## 11. Structured Data (Schema.org) -Applirank uses `@nuxtjs/seo` which auto-generates schema. Always enhance it. +Reqcore uses `@nuxtjs/seo` which auto-generates schema. Always enhance it. ### 11.1 Blog Articles — Required Schema Every blog article page (`app/pages/blog/[...slug].vue`) must use: @@ -296,14 +296,14 @@ useSchemaOrg([ dateModified: new Date(post.value.date).toISOString(), // Update when content changes author: { '@type': 'Person', - name: post.value.author || 'Applirank Team', - url: 'https://applirank.com', // Link to author page when available + name: post.value.author || 'Reqcore Team', + url: 'https://reqcore.com', // Link to author page when available }, image: post.value.image || '/og-image.png', publisher: { '@type': 'Organization', - name: 'Applirank', - url: 'https://applirank.com', + name: 'Reqcore', + url: 'https://reqcore.com', }, }), ]) @@ -365,7 +365,7 @@ useSeoMeta({ - **Largest Contentful Paint (LCP)** < 2.5s — avoid massive hero images above the fold - **Cumulative Layout Shift (CLS)** < 0.1 — always specify image dimensions - **Interaction to Next Paint (INP)** < 200ms — avoid heavy JS on content pages -- Applirank uses ISR/prerender for public pages — this helps significantly +- Reqcore uses ISR/prerender for public pages — this helps significantly ### 12.5 Route Rules (Already Configured) ```typescript @@ -418,7 +418,7 @@ pulled into a featured snippet.] ## [H2 — Another Major Subtopic] -[Content with internal links to related Applirank pages and external links to +[Content with internal links to related Reqcore pages and external links to authoritative sources.] | Comparison Column A | Column B | @@ -444,12 +444,12 @@ authoritative sources.] ## The Bottom Line -[Summary paragraph. Restate key takeaway. Include CTA mentioning Applirank +[Summary paragraph. Restate key takeaway. Include CTA mentioning Reqcore naturally.] --- -*[Applirank](/) is an open-source applicant tracking system with transparent AI, +*[Reqcore](/) is an open-source applicant tracking system with transparent AI, no per-seat pricing, and full data ownership. [Try the live demo](/auth/sign-in) or explore the [product roadmap](/roadmap).* ``` @@ -477,7 +477,7 @@ Run through this checklist before publishing or updating any blog article: - [ ] Opening answers the core question immediately (featured snippet optimization) ### Links -- [ ] 3–5 internal links to relevant Applirank pages +- [ ] 3–5 internal links to relevant Reqcore pages - [ ] 3–8 external links to authoritative sources - [ ] All links use descriptive anchor text - [ ] No broken links @@ -517,9 +517,9 @@ Run through this checklist before publishing or updating any blog article: --- -## 17. Applirank-Specific Content Topics (High Business Potential) +## 17. Reqcore-Specific Content Topics (High Business Potential) -When choosing blog topics, prioritize these topic clusters where Applirank naturally fits as a solution: +When choosing blog topics, prioritize these topic clusters where Reqcore naturally fits as a solution: ### Cluster 1: ATS Comparison & Selection (Business Potential: 3) - "Best open-source ATS" / "open-source applicant tracking systems" diff --git a/.env.example b/.env.example index bd072241..96d75e24 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ # ───────────────────────────────────────────────────────────────────────────── -# Applirank — Environment Variable Reference +# Reqcore — Environment Variable Reference # ───────────────────────────────────────────────────────────────────────────── # Local development: run ./setup.sh — it generates .env automatically. # Production / manual setup: copy this file to .env and fill in the values. @@ -7,14 +7,14 @@ # ─── Database ──────────────────────────────────────────────────────────────── # Used by docker-compose.yml to configure the Postgres container -DB_USER=applirank +DB_USER=reqcore DB_PASSWORD=change-me -DB_NAME=applirank +DB_NAME=reqcore # PostgreSQL connection string (used by host tools: drizzle-kit, drizzle studio) # docker-compose overrides this with the internal Docker hostname for the app. # Railway: ${{Postgres.DATABASE_URL}} -DATABASE_URL=postgresql://applirank:change-me@localhost:5432/applirank +DATABASE_URL=postgresql://reqcore:change-me@localhost:5432/reqcore # ─── Authentication ────────────────────────────────────────────────────────── # Min 32-character random string. Generate with: openssl rand -base64 32 @@ -30,7 +30,7 @@ BETTER_AUTH_URL=http://localhost:3000 # ─── Object Storage (S3-compatible) ────────────────────────────────────────── # Used by docker-compose.yml to configure the MinIO container -STORAGE_USER=applirank +STORAGE_USER=reqcore STORAGE_PASSWORD=change-me # App-level S3 config (used by host tools) @@ -38,9 +38,9 @@ STORAGE_PASSWORD=change-me # Local (MinIO): S3_ENDPOINT=http://localhost:9000, S3_FORCE_PATH_STYLE=true # Railway Bucket: S3_ENDPOINT=${{Bucket.ENDPOINT}}, S3_FORCE_PATH_STYLE=false S3_ENDPOINT=http://localhost:9000 -S3_ACCESS_KEY=applirank +S3_ACCESS_KEY=reqcore S3_SECRET_KEY=change-me -S3_BUCKET=applirank +S3_BUCKET=reqcore S3_REGION=us-east-1 S3_FORCE_PATH_STYLE=true @@ -49,12 +49,12 @@ S3_FORCE_PATH_STYLE=true NUXT_PUBLIC_SITE_URL=http://localhost:3000 # Public URL for the "Upgrade to hosted plan" button in the preview upsell modal -# NUXT_PUBLIC_HOSTED_PLAN_URL=https://applirank.com +# NUXT_PUBLIC_HOSTED_PLAN_URL=https://reqcore.com # ─── Optional: Demo Mode ───────────────────────────────────────────────────── # Set to an org slug to make that org read-only (blocks all mutations) -# Default seeded slug: applirank-demo -# DEMO_ORG_SLUG=applirank-demo +# Default seeded slug: reqcore-demo +# DEMO_ORG_SLUG=reqcore-demo # ─── Optional: Trusted Proxy ───────────────────────────────────────────────── # IP of the reverse proxy (Cloudflare, Railway, nginx). Enables accurate @@ -65,4 +65,4 @@ NUXT_PUBLIC_SITE_URL=http://localhost:3000 # Fine-grained GitHub PAT with Issues:write scope # GITHUB_FEEDBACK_TOKEN=ghp_... # GitHub repo in "owner/repo" format -# GITHUB_FEEDBACK_REPO=applirank/applirank +# GITHUB_FEEDBACK_REPO=reqcore/reqcore diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index a2e0616b..4d817e5a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,5 @@ name: Bug report -description: Report a reproducible defect in Applirank +description: Report a reproducible defect in Reqcore labels: - bug body: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index cc13184a..bd249bba 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - name: Security vulnerability report - url: mailto:security@applirank.com + url: mailto:security@reqcore.com about: Please report vulnerabilities privately by email. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 0d74d806..79c71c18 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,5 @@ name: Feature request -description: Propose an improvement to Applirank +description: Propose an improvement to Reqcore labels: - enhancement body: @@ -21,7 +21,7 @@ body: id: solution attributes: label: Proposed solution - description: What should Applirank do? + description: What should Reqcore do? placeholder: Add a ... page / API / workflow that ... validations: required: true @@ -46,5 +46,5 @@ body: options: - label: I searched existing issues and did not find a duplicate. required: true - - label: This request aligns with Applirank's ownership/transparency/privacy direction. + - label: This request aligns with Reqcore's ownership/transparency/privacy direction. required: false diff --git a/.github/prompts/master-seo-prompt.prompt.md b/.github/prompts/master-seo-prompt.prompt.md index e0ac3c52..9a6cd2a2 100644 --- a/.github/prompts/master-seo-prompt.prompt.md +++ b/.github/prompts/master-seo-prompt.prompt.md @@ -5,7 +5,7 @@ description: End-to-end SEO article pipeline — runs all 5 phases from topic re # Master SEO Pipeline — Full Article Production -This prompt orchestrates the complete 5-phase SEO article pipeline for Applirank's blog. Each phase uses its dedicated skill file. Execute phases **sequentially** — each phase's output feeds the next. Stop at any phase if its quality gate fails. +This prompt orchestrates the complete 5-phase SEO article pipeline for Reqcore's blog. Each phase uses its dedicated skill file. Execute phases **sequentially** — each phase's output feeds the next. Stop at any phase if its quality gate fails. --- @@ -42,7 +42,7 @@ This prompt orchestrates the complete 5-phase SEO article pipeline for Applirank 4. **Content Gap Analysis** — Fetch and analyze top 5–10 ranking pages; extract PAA questions; identify what competitors miss 5. **Original Angle Identification** — Define 2–3 unique angles from builder experience, review data, contrarian opinions, original data, or technical depth 6. **Internal Link Planning** — Plan 3–5 outgoing links and 2–3 incoming links for topical authority reinforcement -7. **Business Potential Scoring** — Score 1–3 for Applirank alignment; recommend a natural CTA +7. **Business Potential Scoring** — Score 1–3 for Reqcore alignment; recommend a natural CTA ### Output @@ -51,7 +51,7 @@ A structured **Topic Brief** (see the template in the skill file §8). ### Decision Gate **STOP if any of these are true:** -- Business potential = 1 (no natural Applirank connection) +- Business potential = 1 (no natural Reqcore connection) - High cannibalization with no resolution path - Cannot find at least 2 original angles - Transactional or navigational intent (not a blog topic) @@ -114,7 +114,7 @@ When a gate fails, tell the human exactly what's missing and provide the specifi - **Links**: 3–5 internal links (keyword-rich anchor text), 3–8 external links to authoritative sources - **LLM-ready**: Each H2 section stands alone as a citable chunk. Key points are quotable, declarative sentences. Include an FAQ section addressing PAA questions - **No AI voice artifacts**: No "In today's competitive...", "Let's dive in", "It's important to note", "When it comes to...", "Whether you're a X or a Y", "Look no further", "Game-changer", "Comprehensive guide", "Stands out from the crowd" -- **CTA**: End with a natural Applirank mention and CTA from the Topic Brief's business potential assessment +- **CTA**: End with a natural Reqcore mention and CTA from the Topic Brief's business potential assessment ### Frontmatter Requirements @@ -237,5 +237,5 @@ After Phase 5 passes, complete these final steps: - [Topical Authority Map](../../TOPICAL-AUTHORITY-MAP.md) — The 132-article content plan with clusters, phases, and cross-linking rules - [Existing blog content](../../content/blog/) — Published articles for cannibalization checks and internal linking -- [Product Vision](../../PRODUCT.md) — Applirank's UVP, audience, and positioning +- [Product Vision](../../PRODUCT.md) — Reqcore's UVP, audience, and positioning - [Copilot Instructions](../copilot-instructions.md) — Codebase conventions, design system, and project structure \ No newline at end of file diff --git a/.github/workflows/docker-readme-validation.yml b/.github/workflows/docker-readme-validation.yml index 14c7a3d3..527a6491 100644 --- a/.github/workflows/docker-readme-validation.yml +++ b/.github/workflows/docker-readme-validation.yml @@ -100,7 +100,7 @@ jobs: set -euo pipefail echo "Waiting for db..." for i in $(seq 60); do - state="$(docker inspect --format='{{.State.Health.Status}}' applirank_db 2>/dev/null || echo 'not-started')" + state="$(docker inspect --format='{{.State.Health.Status}}' reqcore_db 2>/dev/null || echo 'not-started')" echo " db: $state" [ "$state" = "healthy" ] && break if [ "$i" -eq 60 ]; then @@ -117,7 +117,7 @@ jobs: set -euo pipefail echo "Waiting for minio..." for i in $(seq 60); do - state="$(docker inspect --format='{{.State.Health.Status}}' applirank_minio 2>/dev/null || echo 'not-started')" + state="$(docker inspect --format='{{.State.Health.Status}}' reqcore_minio 2>/dev/null || echo 'not-started')" echo " minio: $state" [ "$state" = "healthy" ] && break if [ "$i" -eq 60 ]; then @@ -138,7 +138,7 @@ jobs: echo "✅ App is reachable on http://localhost:3000" exit 0 fi - state="$(docker inspect --format='{{.State.Status}}' applirank_app 2>/dev/null || echo 'missing')" + state="$(docker inspect --format='{{.State.Status}}' reqcore_app 2>/dev/null || echo 'missing')" if [ "$state" = "exited" ] || [ "$state" = "dead" ]; then echo "❌ App container exited unexpectedly" docker compose logs app --tail=100 @@ -165,7 +165,7 @@ jobs: - name: Assert S3 bucket is ready run: | set -euo pipefail - if ! docker compose logs app | grep -q 'S3 bucket "applirank" is ready'; then + if ! docker compose logs app | grep -q 'S3 bucket "reqcore" is ready'; then echo "❌ S3 bucket ready message not found in app logs" docker compose logs app exit 1 @@ -217,7 +217,7 @@ jobs: set -euo pipefail response="$(curl -s -X POST http://localhost:3000/api/auth/sign-in/email \ -H "Content-Type: application/json" \ - -d '{"email":"demo@applirank.com","password":"demo1234"}' \ + -d '{"email":"demo@reqcore.com","password":"demo1234"}' \ -w "\n%{http_code}")" body="$(echo "$response" | head -n -1)" status="$(echo "$response" | tail -n 1)" @@ -227,7 +227,7 @@ jobs: echo "❌ Sign-in failed — expected 200, got $status" exit 1 fi - if ! echo "$body" | grep -q "demo@applirank.com"; then + if ! echo "$body" | grep -q "demo@reqcore.com"; then echo "❌ Response body does not contain expected email" exit 1 fi diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 67a8c1d2..359c4063 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1,8 +1,8 @@ -# Applirank — System Architecture +# Reqcore — System Architecture ## Overview -Applirank is a **Nuxt 4** full-stack application following a monolithic architecture with clear separation between client (`app/`) and server (`server/`) code. The system supports both **managed deployment** on Railway and **self-hosted deployment** via Docker Compose. +Reqcore is a **Nuxt 4** full-stack application following a monolithic architecture with clear separation between client (`app/`) and server (`server/`) code. The system supports both **managed deployment** on Railway and **self-hosted deployment** via Docker Compose. ## Technology Stack @@ -26,7 +26,7 @@ Applirank is a **Nuxt 4** full-stack application following a monolithic architec ## Directory Structure ``` -applirank/ +reqcore/ ├── app/ # Client source (Nuxt 4 srcDir) │ ├── app.vue # Root component │ ├── assets/ @@ -222,7 +222,7 @@ Public-facing endpoints live under `server/api/public/` and require no authentic ### 10. SEO & Structured Data -Applirank uses `@nuxtjs/seo` for comprehensive search engine optimization: +Reqcore uses `@nuxtjs/seo` for comprehensive search engine optimization: | Feature | Implementation | |---------|---------------| @@ -262,7 +262,7 @@ Blog articles are Markdown files in `content/blog/` powered by `@nuxt/content` v | Environment secrets | Validated at startup, never exposed to client | ## Deployment Architecture -Applirank runs on **Railway** with **Cloudflare** as CDN/DNS: +Reqcore runs on **Railway** with **Cloudflare** as CDN/DNS: | Component | Role | |-----------|------| @@ -295,7 +295,7 @@ Variables are configured in the Railway dashboard or via `railway variables`. Se | `S3_REGION` | `${{Bucket.REGION}}` | | `S3_FORCE_PATH_STYLE` | `false` | | `BETTER_AUTH_SECRET` | Manual (sealed) | -| `BETTER_AUTH_URL` | Production: `https://applirank.com` · PR/preview: `https://${{RAILWAY_PUBLIC_DOMAIN}}` | +| `BETTER_AUTH_URL` | Production: `https://reqcore.com` · PR/preview: `https://${{RAILWAY_PUBLIC_DOMAIN}}` | For zero manual PR setup, define `BETTER_AUTH_URL` as `https://${{RAILWAY_PUBLIC_DOMAIN}}` in your Railway preview/PR environment (or shared variables scoped to previews). ## Local Development Services diff --git a/CHANGELOG.md b/CHANGELOG.md index 429f144c..ca64d08a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -All notable changes to Applirank are documented here, organized by date. +All notable changes to Reqcore are documented here, organized by date. Format follows [Keep a Changelog](https://keepachangelog.com). Categories: **Added**, **Changed**, **Fixed**, **Removed**. @@ -20,7 +20,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com). Categories: **Add ### Changed - **Unified Railway seeding path** — Railway predeploy now runs `db:seed` (same script as standard demo data), removing PR-specific seed divergence between preview and production-like environments -- **Preview demo defaults aligned** — runtime preview fallbacks now target `applirank-demo` and `demo@applirank.com` to match `server/scripts/seed.ts` +- **Preview demo defaults aligned** — runtime preview fallbacks now target `reqcore-demo` and `demo@reqcore.com` to match `server/scripts/seed.ts` ### Removed @@ -40,7 +40,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com). Categories: **Add ### Changed - **Lockfile hygiene** — refreshed dependency graph with `npm install` + `npm dedupe` to remove stale vulnerable transitive entries -- **Demo env guidance** — `.env.example` demo slug example now matches seeded demo organization slug (`applirank-demo`) to reduce configuration drift +- **Demo env guidance** — `.env.example` demo slug example now matches seeded demo organization slug (`reqcore-demo`) to reduce configuration drift --- diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 8939111d..7b2447c3 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -36,7 +36,7 @@ This Code of Conduct applies within all community spaces, and also applies when ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at security@applirank.com. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at security@reqcore.com. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d67e29bb..16e02484 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -# Contributing to Applirank +# Contributing to Reqcore -Thanks for contributing to Applirank. +Thanks for contributing to Reqcore. ## Before You Start @@ -11,8 +11,8 @@ Thanks for contributing to Applirank. ## Development Setup ```bash -git clone https://github.com/applirank/applirank.git -cd applirank +git clone https://github.com/reqcore/reqcore.git +cd reqcore cp .env.example .env docker compose up -d npm install @@ -28,7 +28,7 @@ npm run dev ### DCO Sign-off (Required) -Applirank uses the Developer Certificate of Origin (DCO) instead of a CLA. +Reqcore uses the Developer Certificate of Origin (DCO) instead of a CLA. Sign every commit with: diff --git a/Dockerfile b/Dockerfile index b4950805..9e84a35e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ WORKDIR /app ENV NODE_ENV=production -RUN addgroup -S applirank && adduser -S applirank -G applirank +RUN addgroup -S reqcore && adduser -S reqcore -G reqcore # .output is fully self-contained (includes content DB, server, public assets) COPY --from=builder /app/.output ./.output @@ -37,8 +37,8 @@ COPY --from=builder /app/drizzle.config.ts ./drizzle.config.ts COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/server ./server -RUN chown -R applirank:applirank /app -USER applirank +RUN chown -R reqcore:reqcore /app +USER reqcore EXPOSE 3000 diff --git a/PRODUCT.md b/PRODUCT.md index 9a9e78d9..3790ba00 100644 --- a/PRODUCT.md +++ b/PRODUCT.md @@ -1,8 +1,8 @@ -# Applirank — Product Vision & Goals +# Reqcore — Product Vision & Goals ## The Sovereign Recruitment Engine -Applirank is a lean, open-source Applicant Tracking System (ATS) designed to return power to the employer. We are the **"Glass Box"** alternative to the **"Black Box"** incumbents. +Reqcore is a lean, open-source Applicant Tracking System (ATS) designed to return power to the employer. We are the **"Glass Box"** alternative to the **"Black Box"** incumbents. ## Problem Statement @@ -21,10 +21,10 @@ You *own* the infrastructure (Postgres + MinIO). Your talent pool is a permanent We reject "Secret Algorithms." When AI ranks a candidate, it **must** provide a visible **Matching Logic** summary so recruiters can verify the result. Every AI decision is explainable and auditable. ### 3. The Anti-Growth Tax -No per-seat pricing. Applirank is designed to let companies scale their hiring teams without increasing their software bill. +No per-seat pricing. Reqcore is designed to let companies scale their hiring teams without increasing their software bill. ### 4. Privacy Sovereignty -By supporting local-first storage (MinIO) and local AI models (Ollama), Applirank is the only ATS where sensitive candidate PII never has to leave the company's private network. +By supporting local-first storage (MinIO) and local AI models (Ollama), Reqcore is the only ATS where sensitive candidate PII never has to leave the company's private network. ## Target Users @@ -55,7 +55,7 @@ By supporting local-first storage (MinIO) and local AI models (Ollama), Appliran ### Phase 3 — Collaboration - [ ] Team comments and notes on candidates - [ ] Interview scheduling -- [ ] Email integration (send/receive from within Applirank) +- [ ] Email integration (send/receive from within Reqcore) - [ ] Candidate portal (self-service application status) ## Design Principles diff --git a/README.md b/README.md index 0437f273..1f39f5d6 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@
- Thank you for helping improve Applirank. Your feedback has been recorded. + Thank you for helping improve Reqcore. Your feedback has been recorded.
- Want write access? Upgrade to a paid hosted plan or deploy your own Applirank instance. + Want write access? Upgrade to a paid hosted plan or deploy your own Reqcore instance.
The Sovereign Recruitment Engine