Skip to content

feat: simplify public site architecture - #11

Merged
onerandomdevv merged 2 commits into
devfrom
codex/remove-deprecated-pages
Jul 20, 2026
Merged

feat: simplify public site architecture#11
onerandomdevv merged 2 commits into
devfrom
codex/remove-deprecated-pages

Conversation

@onerandomdevv

@onerandomdevv onerandomdevv commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

What changed

  • Removes dedicated public About, Careers, Contact, Products list, and Product detail pages.
  • Removes public contact and career application APIs.
  • Removes admin Careers, Applications, and Messages sections/routes.
  • Removes Resend/react-email integration and email helper.
  • Updates Drizzle schema to keep team members, products, blog posts, and admin users.
  • Adds migration to drop career_applications, careers, and contact_submissions.
  • Updates navbar, footer, sitemap, README, and AGENTS.md to match the reduced site surface.

Why

Keeps the company website focused around Home, Blog, and Team while products are introduced through company blog updates and external CTAs.

Validation

  • pnpm build passed
  • pnpm exec tsc --noEmit passed
  • pnpm exec eslint src --ext .ts,.tsx --max-warnings 0 passed

Summary by CodeRabbit

  • New Features

    • Reworked the homepage with a company-focused hero, goals, and latest blog releases.
    • Introduced blog search, category filters, featured content, related posts, table of contents, and load-more browsing.
    • Added improved image uploads with previews and cropping for admin content.
    • Updated navigation and footer with clearer structure and external Twizrr calls to action.
  • Enhancements

    • Refreshed visual styling, animations, accessibility, responsive layouts, and iconography.
    • Simplified public navigation and removed public careers, contact, and product pages.
    • Updated setup and project documentation to reflect the current website experience.

@socket-security

socket-security Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedclass-variance-authority@​0.7.11001006780100
Added@​base-ui/​react@​1.6.0721008994100
Addedlucide-react@​1.21.0100100989680
Addedtw-animate-css@​1.4.01001009386100
Addedshadcn@​4.11.0981009198100

View full report

@socket-security

socket-security Bot commented Jul 20, 2026

Copy link
Copy Markdown

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm execa is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: pnpm-lock.yamlnpm/shadcn@4.11.0npm/execa@9.6.1

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/execa@9.6.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm powershell-utils is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: pnpm-lock.yamlnpm/shadcn@4.11.0npm/powershell-utils@0.1.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/powershell-utils@0.1.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@onerandomdevv, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 42 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2bf71fd1-d1bb-49c8-bc87-a6ef3bc31c69

📥 Commits

Reviewing files that changed from the base of the PR and between cee5eb9 and b07989a.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (1)
  • package.json
📝 Walkthrough

Walkthrough

The PR repositions the site around company and blog content, removes careers, contact, and public product workflows, updates the database schema and migrations, rebuilds blog and homepage presentation, and reorganizes shared admin UI, media, navigation, styling, and project documentation.

Changes

Company site redesign and platform cleanup

Layer / File(s) Summary
Project guidance and development tooling
.env.example, AGENTS.md, README.md, components.json, design-qa.md, eslint.config.mjs, package.json, src/app/globals.css
Documentation, environment templates, UI configuration, linting, dependencies, global theme tokens, and footer QA documentation are updated.
Content-only data model and route retirement
src/app/(public)/about/*, src/app/(public)/careers/*, src/app/(public)/contact/*, src/app/(public)/products/*, src/app/admin/(protected)/careers/*, src/app/admin/(protected)/applications/*, src/app/admin/(protected)/messages/*, src/app/api/careers/*, src/app/api/contact/*, src/app/api/admin/{careers,applications,messages}/*, src/db/*, src/lib/email.ts, src/types/index.ts
Career, contact, email-notification, and product-facing route workflows are removed, along with their database tables, types, APIs, and migration support.
Blog and homepage content flow
src/app/(public)/page.tsx, src/app/(public)/blog/*, src/components/blog/*, src/components/sections/{FeaturedStorySection,GoalsSection}.tsx, src/app/(public)/team/page.tsx
The homepage uses a hero, goals, and latest releases; the blog adds search, filters, pagination, heading anchors, a table of contents, and related posts.
Public navigation and visual system
src/components/layout/*, src/components/sections/*, src/components/ui/icons.tsx, src/app/sitemap.ts
Navigation and footer structures are rebuilt, Twizrr CTAs point externally, Lucide icons replace several custom icons, and product URLs are removed from the sitemap.
Admin UI and media infrastructure
src/components/admin/*, src/app/admin/(protected)/*
Admin imports are reorganized, deletion and image-cropping components are added, the recognition form markup gains accessibility attributes, and the dashboard is reduced to content statistics.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Visitor
  participant BlogPage
  participant Database
  participant BlogList
  participant PostContent

  Visitor->>BlogPage: Open blog list or post
  BlogPage->>Database: Fetch published posts
  Database-->>BlogPage: Return post data
  BlogPage->>BlogList: Render searchable and paginated articles
  BlogPage->>PostContent: Render article content
  PostContent->>PostContent: Assign heading IDs
  BlogPage-->>Visitor: Display article, TOC, and related posts
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description covers the change and rationale, but it misses most required template sections like type, checklist, screenshots, and notes. Rewrite the description to match the repository template and include the type of change, full checklist, screenshots if relevant, and reviewer notes.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately summarizes the main change: simplifying the public site architecture.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/remove-deprecated-pages

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/app/`(public)/blog/[slug]/page.tsx:
- Around line 44-77: Update getNodeText to concatenate child text without
inserting separators so heading text matches the slug source used by
PostContent. In getTableOfContents, restrict collected headings to levels 2 and
3 if those are the only anchor targets, while preserving existing slug and text
handling.

In `@src/app/`(public)/page.tsx:
- Around line 33-38: Update the homepage component’s main render to follow the
required order: HeroSection, FeaturedStorySection, LatestReleasesSection, then
RecognitionSection. Replace GoalsSection with the existing FeaturedStorySection
and add RecognitionSection while preserving latestPosts on
LatestReleasesSection.

In `@src/app/admin/`(protected)/blog/page.tsx:
- Around line 68-70: Replace the mojibake character in the recognition Badge
within the post rendering block with the lucide-react Star icon, adding the Star
import alongside the file’s existing imports. Keep the “Recognition” label and
badge variant unchanged, and render the icon using the project’s established
icon sizing and accessibility conventions.

In `@src/components/admin/actions/AdminDeleteButton.tsx`:
- Line 5: Update the Button import in AdminDeleteButton to reference the
generated admin UI button under the admin UI components, replacing the public UI
primitive while preserving the existing Button usage.

In `@src/components/admin/media/ImageUpload.tsx`:
- Around line 252-298: Update the crop modal container around sourceUrl to
expose dialog semantics with role="dialog" and aria-modal="true", and add an
Escape-key handler that invokes closeCropper while the modal is open. Ensure
keyboard focus is contained within the modal so users cannot tab into background
content, while preserving the existing Cancel control as a dismissal option.

In `@src/components/blog/UpdatesList.tsx`:
- Around line 218-226: Update the post-list derivation around featuredPosts,
allPosts, visiblePosts, and leadPost so the lead post rendered by
FeaturedArticle is excluded from downstream featured and all-article
collections. Preserve the existing filtering, slicing, and visibility behavior
for the remaining posts.

In `@src/components/layout/Footer.tsx`:
- Around line 164-170: Update the Image element in the Footer component to
replace the fixed h-[120px] class with h-auto, preserving the wordmark’s
intrinsic aspect ratio while retaining the existing responsive width classes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 96c951fb-c65e-4b5b-9005-6bcad48b12a3

📥 Commits

Reviewing files that changed from the base of the PR and between afc37e2 and cee5eb9.

⛔ Files ignored due to path filters (3)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • public/mascot/kody.svg is excluded by !**/*.svg
  • public/mascot/kodysmile.svg is excluded by !**/*.svg
📒 Files selected for processing (71)
  • .env.example
  • AGENTS.md
  • README.md
  • components.json
  • design-qa.md
  • eslint.config.mjs
  • package.json
  • src/app/(public)/about/page.tsx
  • src/app/(public)/blog/[slug]/page.tsx
  • src/app/(public)/blog/page.tsx
  • src/app/(public)/careers/page.tsx
  • src/app/(public)/contact/page.tsx
  • src/app/(public)/page.tsx
  • src/app/(public)/products/[slug]/page.tsx
  • src/app/(public)/products/page.tsx
  • src/app/(public)/team/page.tsx
  • src/app/admin/(protected)/applications/page.tsx
  • src/app/admin/(protected)/blog/[id]/page.tsx
  • src/app/admin/(protected)/blog/new/page.tsx
  • src/app/admin/(protected)/blog/page.tsx
  • src/app/admin/(protected)/careers/[id]/page.tsx
  • src/app/admin/(protected)/careers/new/page.tsx
  • src/app/admin/(protected)/careers/page.tsx
  • src/app/admin/(protected)/dashboard/page.tsx
  • src/app/admin/(protected)/messages/page.tsx
  • src/app/admin/(protected)/products/[id]/page.tsx
  • src/app/admin/(protected)/products/new/page.tsx
  • src/app/admin/(protected)/products/page.tsx
  • src/app/admin/(protected)/team/[id]/page.tsx
  • src/app/admin/(protected)/team/new/page.tsx
  • src/app/admin/(protected)/team/page.tsx
  • src/app/api/admin/applications/[id]/route.ts
  • src/app/api/admin/applications/route.ts
  • src/app/api/admin/careers/[id]/route.ts
  • src/app/api/admin/careers/route.ts
  • src/app/api/admin/messages/[id]/route.ts
  • src/app/api/admin/messages/route.ts
  • src/app/api/careers/apply/route.ts
  • src/app/api/contact/route.ts
  • src/app/globals.css
  • src/app/sitemap.ts
  • src/components/admin/ApplicationsManager.tsx
  • src/components/admin/MessagesManager.tsx
  • src/components/admin/actions/AdminDeleteButton.tsx
  • src/components/admin/editors/RichTextEditor.tsx
  • src/components/admin/forms/ResourceForms.tsx
  • src/components/admin/media/ImageUpload.tsx
  • src/components/admin/tables/DataTable.tsx
  • src/components/admin/ui/button.tsx
  • src/components/blog/PostContent.tsx
  • src/components/blog/UpdatesList.tsx
  • src/components/careers/ApplicationForm.tsx
  • src/components/contact/ContactForm.tsx
  • src/components/layout/AdminSidebar.tsx
  • src/components/layout/Footer.tsx
  • src/components/layout/Navbar.tsx
  • src/components/sections/AboutTeaser.tsx
  • src/components/sections/FeaturedStorySection.tsx
  • src/components/sections/GoalsSection.tsx
  • src/components/sections/HeroSection.tsx
  • src/components/sections/LatestReleasesSection.tsx
  • src/components/sections/ProductsSection.tsx
  • src/components/sections/RecognitionSection.tsx
  • src/components/sections/TeamSection.tsx
  • src/components/ui/icons.tsx
  • src/db/migrations/0004_confused_chamber.sql
  • src/db/migrations/meta/0004_snapshot.json
  • src/db/migrations/meta/_journal.json
  • src/db/schema.ts
  • src/lib/email.ts
  • src/types/index.ts
💤 Files with no reviewable changes (29)
  • src/components/sections/AboutTeaser.tsx
  • src/app/api/contact/route.ts
  • src/app/api/admin/applications/route.ts
  • src/app/admin/(protected)/applications/page.tsx
  • src/app/admin/(protected)/messages/page.tsx
  • src/app/admin/(protected)/careers/[id]/page.tsx
  • src/components/careers/ApplicationForm.tsx
  • src/lib/email.ts
  • src/app/admin/(protected)/careers/new/page.tsx
  • src/app/api/admin/careers/route.ts
  • src/app/api/admin/applications/[id]/route.ts
  • src/components/sections/ProductsSection.tsx
  • src/app/api/admin/messages/[id]/route.ts
  • src/components/admin/MessagesManager.tsx
  • src/app/api/careers/apply/route.ts
  • src/components/sections/TeamSection.tsx
  • src/app/(public)/careers/page.tsx
  • src/app/admin/(protected)/careers/page.tsx
  • src/app/(public)/products/[slug]/page.tsx
  • src/app/(public)/about/page.tsx
  • src/app/(public)/products/page.tsx
  • src/components/contact/ContactForm.tsx
  • src/components/admin/ApplicationsManager.tsx
  • src/app/(public)/contact/page.tsx
  • src/app/api/admin/messages/route.ts
  • src/app/api/admin/careers/[id]/route.ts
  • src/db/schema.ts
  • src/types/index.ts
  • .env.example

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/app/`(public)/blog/[slug]/page.tsx:
- Around line 44-77: Update getNodeText to concatenate child text without
inserting separators so heading text matches the slug source used by
PostContent. In getTableOfContents, restrict collected headings to levels 2 and
3 if those are the only anchor targets, while preserving existing slug and text
handling.

In `@src/app/`(public)/page.tsx:
- Around line 33-38: Update the homepage component’s main render to follow the
required order: HeroSection, FeaturedStorySection, LatestReleasesSection, then
RecognitionSection. Replace GoalsSection with the existing FeaturedStorySection
and add RecognitionSection while preserving latestPosts on
LatestReleasesSection.

In `@src/app/admin/`(protected)/blog/page.tsx:
- Around line 68-70: Replace the mojibake character in the recognition Badge
within the post rendering block with the lucide-react Star icon, adding the Star
import alongside the file’s existing imports. Keep the “Recognition” label and
badge variant unchanged, and render the icon using the project’s established
icon sizing and accessibility conventions.

In `@src/components/admin/actions/AdminDeleteButton.tsx`:
- Line 5: Update the Button import in AdminDeleteButton to reference the
generated admin UI button under the admin UI components, replacing the public UI
primitive while preserving the existing Button usage.

In `@src/components/admin/media/ImageUpload.tsx`:
- Around line 252-298: Update the crop modal container around sourceUrl to
expose dialog semantics with role="dialog" and aria-modal="true", and add an
Escape-key handler that invokes closeCropper while the modal is open. Ensure
keyboard focus is contained within the modal so users cannot tab into background
content, while preserving the existing Cancel control as a dismissal option.

In `@src/components/blog/UpdatesList.tsx`:
- Around line 218-226: Update the post-list derivation around featuredPosts,
allPosts, visiblePosts, and leadPost so the lead post rendered by
FeaturedArticle is excluded from downstream featured and all-article
collections. Preserve the existing filtering, slicing, and visibility behavior
for the remaining posts.

In `@src/components/layout/Footer.tsx`:
- Around line 164-170: Update the Image element in the Footer component to
replace the fixed h-[120px] class with h-auto, preserving the wordmark’s
intrinsic aspect ratio while retaining the existing responsive width classes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 96c951fb-c65e-4b5b-9005-6bcad48b12a3

📥 Commits

Reviewing files that changed from the base of the PR and between afc37e2 and cee5eb9.

⛔ Files ignored due to path filters (3)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • public/mascot/kody.svg is excluded by !**/*.svg
  • public/mascot/kodysmile.svg is excluded by !**/*.svg
📒 Files selected for processing (71)
  • .env.example
  • AGENTS.md
  • README.md
  • components.json
  • design-qa.md
  • eslint.config.mjs
  • package.json
  • src/app/(public)/about/page.tsx
  • src/app/(public)/blog/[slug]/page.tsx
  • src/app/(public)/blog/page.tsx
  • src/app/(public)/careers/page.tsx
  • src/app/(public)/contact/page.tsx
  • src/app/(public)/page.tsx
  • src/app/(public)/products/[slug]/page.tsx
  • src/app/(public)/products/page.tsx
  • src/app/(public)/team/page.tsx
  • src/app/admin/(protected)/applications/page.tsx
  • src/app/admin/(protected)/blog/[id]/page.tsx
  • src/app/admin/(protected)/blog/new/page.tsx
  • src/app/admin/(protected)/blog/page.tsx
  • src/app/admin/(protected)/careers/[id]/page.tsx
  • src/app/admin/(protected)/careers/new/page.tsx
  • src/app/admin/(protected)/careers/page.tsx
  • src/app/admin/(protected)/dashboard/page.tsx
  • src/app/admin/(protected)/messages/page.tsx
  • src/app/admin/(protected)/products/[id]/page.tsx
  • src/app/admin/(protected)/products/new/page.tsx
  • src/app/admin/(protected)/products/page.tsx
  • src/app/admin/(protected)/team/[id]/page.tsx
  • src/app/admin/(protected)/team/new/page.tsx
  • src/app/admin/(protected)/team/page.tsx
  • src/app/api/admin/applications/[id]/route.ts
  • src/app/api/admin/applications/route.ts
  • src/app/api/admin/careers/[id]/route.ts
  • src/app/api/admin/careers/route.ts
  • src/app/api/admin/messages/[id]/route.ts
  • src/app/api/admin/messages/route.ts
  • src/app/api/careers/apply/route.ts
  • src/app/api/contact/route.ts
  • src/app/globals.css
  • src/app/sitemap.ts
  • src/components/admin/ApplicationsManager.tsx
  • src/components/admin/MessagesManager.tsx
  • src/components/admin/actions/AdminDeleteButton.tsx
  • src/components/admin/editors/RichTextEditor.tsx
  • src/components/admin/forms/ResourceForms.tsx
  • src/components/admin/media/ImageUpload.tsx
  • src/components/admin/tables/DataTable.tsx
  • src/components/admin/ui/button.tsx
  • src/components/blog/PostContent.tsx
  • src/components/blog/UpdatesList.tsx
  • src/components/careers/ApplicationForm.tsx
  • src/components/contact/ContactForm.tsx
  • src/components/layout/AdminSidebar.tsx
  • src/components/layout/Footer.tsx
  • src/components/layout/Navbar.tsx
  • src/components/sections/AboutTeaser.tsx
  • src/components/sections/FeaturedStorySection.tsx
  • src/components/sections/GoalsSection.tsx
  • src/components/sections/HeroSection.tsx
  • src/components/sections/LatestReleasesSection.tsx
  • src/components/sections/ProductsSection.tsx
  • src/components/sections/RecognitionSection.tsx
  • src/components/sections/TeamSection.tsx
  • src/components/ui/icons.tsx
  • src/db/migrations/0004_confused_chamber.sql
  • src/db/migrations/meta/0004_snapshot.json
  • src/db/migrations/meta/_journal.json
  • src/db/schema.ts
  • src/lib/email.ts
  • src/types/index.ts
💤 Files with no reviewable changes (29)
  • src/components/sections/AboutTeaser.tsx
  • src/app/api/contact/route.ts
  • src/app/api/admin/applications/route.ts
  • src/app/admin/(protected)/applications/page.tsx
  • src/app/admin/(protected)/messages/page.tsx
  • src/app/admin/(protected)/careers/[id]/page.tsx
  • src/components/careers/ApplicationForm.tsx
  • src/lib/email.ts
  • src/app/admin/(protected)/careers/new/page.tsx
  • src/app/api/admin/careers/route.ts
  • src/app/api/admin/applications/[id]/route.ts
  • src/components/sections/ProductsSection.tsx
  • src/app/api/admin/messages/[id]/route.ts
  • src/components/admin/MessagesManager.tsx
  • src/app/api/careers/apply/route.ts
  • src/components/sections/TeamSection.tsx
  • src/app/(public)/careers/page.tsx
  • src/app/admin/(protected)/careers/page.tsx
  • src/app/(public)/products/[slug]/page.tsx
  • src/app/(public)/about/page.tsx
  • src/app/(public)/products/page.tsx
  • src/components/contact/ContactForm.tsx
  • src/components/admin/ApplicationsManager.tsx
  • src/app/(public)/contact/page.tsx
  • src/app/api/admin/messages/route.ts
  • src/app/api/admin/careers/[id]/route.ts
  • src/db/schema.ts
  • src/types/index.ts
  • .env.example
🛑 Comments failed to post (7)
src/app/(public)/blog/[slug]/page.tsx (1)

44-77: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
fd -t f 'RichTextEditor.tsx' src/components/admin | xargs -I{} rg -nP -C3 'Heading|levels' {}
rg -nP -C2 'StarterKit|heading' src/components/blog/PostContent.tsx

Repository: coded-devs/website

Length of output: 1314


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the relevant page file and TOC usage.
sed -n '1,180p' src/app/(public)/blog/[slug]/page.tsx

printf '\n--- PostContent ---\n'
sed -n '1,140p' src/components/blog/PostContent.tsx

printf '\n--- RichTextEditor heading controls ---\n'
sed -n '100,150p' src/components/admin/RichTextEditor.tsx

Repository: coded-devs/website

Length of output: 209


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '1,220p' src/lib/utils.ts

printf '\n--- TOC consumer ---\n'
rg -n "getTableOfContents|table of contents|toc" src/app/(public)/blog src/components -g '!**/*.map'

Repository: coded-devs/website

Length of output: 1375


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- page.tsx ---'
sed -n '1,220p' 'src/app/(public)/blog/[slug]/page.tsx'

printf '\n%s\n' '--- PostContent.tsx ---'
sed -n '1,180p' 'src/components/blog/PostContent.tsx'

printf '\n%s\n' '--- RichTextEditor.tsx ---'
sed -n '100,160p' 'src/components/admin/RichTextEditor.tsx'

printf '\n%s\n' '--- TOC references ---'
rg -n "getTableOfContents|table of contents|toc" 'src/app/(public)/blog' 'src/components' -g '!**/*.map'

Repository: coded-devs/website

Length of output: 10069


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- page.tsx ---'
sed -n '1,220p' 'src/app/(public)/blog/[slug]/page.tsx'

printf '\n%s\n' '--- PostContent.tsx ---'
sed -n '1,180p' 'src/components/blog/PostContent.tsx'

printf '\n%s\n' '--- RichTextEditor.tsx ---'
sed -n '100,170p' 'src/components/admin/RichTextEditor.tsx'

printf '\n%s\n' '--- heading-related usage ---'
rg -n 'toggleHeading\\(|heading\\s*[:=]|heading' 'src/components/admin' 'src/components/blog' 'src/app/(public)/blog' -g '!**/*.map'

Repository: coded-devs/website

Length of output: 10069


Align TOC slugs with PostContent. getNodeText inserts spaces between inline children, so a heading split across marks/nodes can produce a fragment that doesn’t match the id assigned in PostContent. Concatenate without separators here; if only h2/h3 should be anchor targets, filter to those levels too.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/app/`(public)/blog/[slug]/page.tsx around lines 44 - 77, Update
getNodeText to concatenate child text without inserting separators so heading
text matches the slug source used by PostContent. In getTableOfContents,
restrict collected headings to levels 2 and 3 if those are the only anchor
targets, while preserving existing slug and text handling.
src/app/(public)/page.tsx (1)

33-38: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the homepage file and nearby section components.
printf '\n== page.tsx ==\n'
cat -n src/app/'(public)'/page.tsx

printf '\n== available public section files ==\n'
git ls-files 'src/app/(public)/**/*.tsx' | sed 's#^`#-` #'

printf '\n== search for section component usage ==\n'
rg -n "HeroSection|GoalsSection|LatestReleasesSection|FeaturedStorySection|RecognitionSection" src/app/'(public)' -g '*.tsx'

Repository: coded-devs/website

Length of output: 2131


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Read the relevant section components if they exist.
for f in \
  src/app/'(public)'/components/HeroSection.tsx \
  src/app/'(public)'/components/GoalsSection.tsx \
  src/app/'(public)'/components/LatestReleasesSection.tsx \
  src/app/'(public)'/components/FeaturedStorySection.tsx \
  src/app/'(public)'/components/RecognitionSection.tsx
do
  if [ -f "$f" ]; then
    printf '\n== %s ==\n' "$f"
    cat -n "$f"
  fi
done

Repository: coded-devs/website

Length of output: 156


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== section component search across repo ==\n'
rg -n "export default function (FeaturedStorySection|RecognitionSection|GoalsSection)|function (FeaturedStorySection|RecognitionSection|GoalsSection)|const (FeaturedStorySection|RecognitionSection|GoalsSection)" src -g '*.tsx' -g '*.ts'

printf '\n== files with matching names ==\n'
fd -a 'FeaturedStorySection.tsx|RecognitionSection.tsx|GoalsSection.tsx' src

printf '\n== inspect GoalsSection ==\n'
if [ -f src/components/sections/GoalsSection.tsx ]; then
  cat -n src/components/sections/GoalsSection.tsx
fi

Repository: coded-devs/website

Length of output: 3287


Restore the homepage section order src/app/(public)/page.tsx still renders Hero → Goals → Latest Releases, but the public homepage contract is Hero → Featured Story → Latest Releases → Recognition. FeaturedStorySection and RecognitionSection already exist, so swap them in here or update the guideline if this redesign is intentional.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/app/`(public)/page.tsx around lines 33 - 38, Update the homepage
component’s main render to follow the required order: HeroSection,
FeaturedStorySection, LatestReleasesSection, then RecognitionSection. Replace
GoalsSection with the existing FeaturedStorySection and add RecognitionSection
while preserving latestPosts on LatestReleasesSection.

Source: Coding guidelines

src/app/admin/(protected)/blog/page.tsx (1)

68-70: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Replace the mojibake character with a Lucide icon.

The â­ character appears to be mojibake from an encoding error (likely a corrupted emoji). Furthermore, as per coding guidelines, emojis should never be used as UI icons. Please replace it with a standard lucide-react icon instead.

♻️ Proposed refactor

First, add the import at the top of the file:

import { Star } from "lucide-react";

Then, update the badge:

-                      <Badge variant="default">â­  Recognition</Badge>
+                      <Badge variant="default" className="gap-1"><Star className="size-3" /> Recognition</Badge>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                    {post.showInRecognition ? (
                      <Badge variant="default" className="gap-1"><Star className="size-3" /> Recognition</Badge>
                    ) : null}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/app/admin/`(protected)/blog/page.tsx around lines 68 - 70, Replace the
mojibake character in the recognition Badge within the post rendering block with
the lucide-react Star icon, adding the Star import alongside the file’s existing
imports. Keep the “Recognition” label and badge variant unchanged, and render
the icon using the project’s established icon sizing and accessibility
conventions.

Source: Coding guidelines

src/components/admin/actions/AdminDeleteButton.tsx (1)

5-5: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Use the admin UI button primitive instead of the public UI button.

As per coding guidelines, admin controls should use the generated shadcn/ui components under src/components/admin/ui/. Please update the import to use the newly created admin button.

♻️ Proposed refactor
-import Button from "`@/components/ui/Button`";
+import { Button } from "`@/components/admin/ui/button`";
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

import { Button } from "`@/components/admin/ui/button`";
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/admin/actions/AdminDeleteButton.tsx` at line 5, Update the
Button import in AdminDeleteButton to reference the generated admin UI button
under the admin UI components, replacing the public UI primitive while
preserving the existing Button usage.

Source: Coding guidelines

src/components/admin/media/ImageUpload.tsx (1)

252-298: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Crop modal lacks dialog semantics and keyboard dismissal.

The overlay at lines 252-298 is a plain fixed div: no role="dialog"/aria-modal="true", no Escape-to-close handler, and no focus trap. Keyboard-only users can tab into background content behind the modal and have no non-mouse way to dismiss it.

♿ Proposed fix: minimal dialog semantics + Escape handling
-      {sourceUrl ? (
-        <div className="fixed inset-0 z-[100] flex items-center justify-center bg-black/60 px-4 py-8">
+      {sourceUrl ? (
+        <div
+          role="dialog"
+          aria-modal="true"
+          aria-label="Crop image"
+          className="fixed inset-0 z-[100] flex items-center justify-center bg-black/60 px-4 py-8"
+          onKeyDown={(event) => {
+            if (event.key === "Escape") {
+              closeCropper();
+            }
+          }}
+        >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

      {sourceUrl ? (
        <div
          role="dialog"
          aria-modal="true"
          aria-label="Crop image"
          className="fixed inset-0 z-[100] flex items-center justify-center bg-black/60 px-4 py-8"
          onKeyDown={(event) => {
            if (event.key === "Escape") {
              closeCropper();
            }
          }}
        >
          <div className="w-full max-w-2xl rounded-lg bg-white p-6 shadow-sm">
            <div className="max-h-[70vh] overflow-auto">
              <ReactCrop
                crop={crop}
                aspect={aspectRatio}
                onChange={(_, percentCrop) => setCrop(percentCrop)}
                onComplete={(pixelCrop) => setCompletedCrop(pixelCrop)}
              >
                <Image
                  ref={imageRef}
                  src={sourceUrl}
                  alt="Crop selected upload"
                  width={1200}
                  height={800}
                  unoptimized
                  className="h-auto max-h-[60vh] w-auto max-w-full"
                  onLoad={handleImageLoad}
                />
              </ReactCrop>
            </div>

            {error ? (
              <p className="mt-4 font-sans text-sm text-[`#DC2626`]">{error}</p>
            ) : null}

            <div className="mt-6 flex flex-wrap justify-end gap-3">
              <Button
                type="button"
                variant="secondary"
                disabled={isUploading}
                onClick={closeCropper}
              >
                Cancel
              </Button>
              <Button
                type="button"
                disabled={isUploading}
                onClick={handleApplyCrop}
              >
                {isUploading ? "Uploading..." : "Apply Crop"}
              </Button>
            </div>
          </div>
        </div>
      ) : null}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/admin/media/ImageUpload.tsx` around lines 252 - 298, Update
the crop modal container around sourceUrl to expose dialog semantics with
role="dialog" and aria-modal="true", and add an Escape-key handler that invokes
closeCropper while the modal is open. Ensure keyboard focus is contained within
the modal so users cannot tab into background content, while preserving the
existing Cancel control as a dismissal option.
src/components/blog/UpdatesList.tsx (1)

218-226: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Lead post is rendered multiple times.

leadPost = posts[0] renders as FeaturedArticle, and because featuredPosts = filteredPosts.slice(0, 3) (and allPosts = filteredPosts) for the default "All" filter, posts[0] also appears as the first "Featured" card and again under "All articles". Consider excluding the lead post from the downstream lists to avoid duplicate presentation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/blog/UpdatesList.tsx` around lines 218 - 226, Update the
post-list derivation around featuredPosts, allPosts, visiblePosts, and leadPost
so the lead post rendered by FeaturedArticle is excluded from downstream
featured and all-article collections. Preserve the existing filtering, slicing,
and visibility behavior for the remaining posts.
src/components/layout/Footer.tsx (1)

164-170: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the image height to preserve its intrinsic aspect ratio.

The h-[120px] class will distort the wordmark's aspect ratio, conflicting with the 190x72 natural dimensions and the w-[135px] mobile width. Although the design QA notes claim this fixed-height utility was corrected, it appears to still be present. Use h-auto to allow the image to scale proportionally with its width.

🎨 Proposed fix
               <Image
                 src="/logos/wordmark.svg"
                 alt="CodedDevs Technology LTD"
                 width={190}
                 height={72}
-                className="h-[120px] w-[135px] brightness-0 invert md:w-[190px]"
+                className="h-auto w-[135px] brightness-0 invert md:w-[190px]"
               />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

                <Image
                  src="/logos/wordmark.svg"
                  alt="CodedDevs Technology LTD"
                  width={190}
                  height={72}
                  className="h-auto w-[135px] brightness-0 invert md:w-[190px]"
                />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/layout/Footer.tsx` around lines 164 - 170, Update the Image
element in the Footer component to replace the fixed h-[120px] class with
h-auto, preserving the wordmark’s intrinsic aspect ratio while retaining the
existing responsive width classes.

@onerandomdevv
onerandomdevv merged commit a0b1675 into dev Jul 20, 2026
6 checks passed
@onerandomdevv
onerandomdevv deleted the codex/remove-deprecated-pages branch July 20, 2026 15:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant