Official company website and internal CMS for CODEDDEVS TECHNOLOGY LTD.
This site presents CODEDDEVS as a product-driven technology company building AI-first software for African markets. The public site is aimed at investors, press, and partners. The admin dashboard is used to manage products, updates, team members, careers, messages, applications, and uploaded media.
- Live URL: https://codeddevs.com
- Company: CODEDDEVS TECHNOLOGY LTD
- RC Number: 9426867
- Location: Lagos, Nigeria
- Contact: codeddevs.team@gmail.com
- Framework: Next.js 14, App Router, TypeScript
- Styling: Tailwind CSS
- Database: Neon PostgreSQL
- ORM: Drizzle ORM
- Auth: NextAuth.js v5 credentials auth
- Editor: TipTap rich text editor
- Images: Cloudinary
- Image cropping: react-image-crop, admin only
- Email: Resend
- Fonts: JetBrains Mono and IBM Plex Sans via
next/font/google - Package manager: pnpm only
- Node.js 20+
- pnpm
- Neon PostgreSQL database
- Cloudinary account
- Resend account
pnpm installCopy .env.example to .env.local and fill in the values.
cp .env.example .env.localRequired variables:
DATABASE_URL=
DATABASE_URL_UNPOOLED=
NEXTAUTH_SECRET=
NEXTAUTH_URL=http://localhost:3000
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=
NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
RESEND_API_KEY=
CONTACT_NOTIFICATION_EMAIL=Use:
DATABASE_URLfor app queries.DATABASE_URL_UNPOOLEDfor Drizzle migrations.NEXTAUTH_SECRETfrom a secure random value.CONTACT_NOTIFICATION_EMAILfor contact and application notifications.
Push the Drizzle schema to Neon:
pnpm drizzle-kit pushGenerate migrations when the schema changes:
pnpm drizzle-kit generateDo not edit generated files in src/db/migrations/ manually.
Create the first admin user:
npx tsx scripts/seed-admin.tsRun this once only, then remove any temporary credentials or rotate them as needed.
pnpm devOpen http://localhost:3000.
pnpm dev
pnpm build
pnpm start
pnpm lint
pnpm tsc --noEmit/- Home/about- Company mission and approach/products- Product list/products/[slug]- Individual product page/blog- User-facing label is "Updates"/blog/[slug]- Editorial update page/team- Team page/careers- Careers page with application form/contact- Contact page and form
Protected routes live under /admin.
/admin/login/admin/dashboard/admin/team/admin/products/admin/blog/admin/careers/admin/applications/admin/messages
Admin API routes live under /api/admin/* and require an authenticated admin session.
- Product CMS with featured products for the home page.
- Updates CMS backed by TipTap JSON content.
- Recognition section controlled by
show_in_recognitionandplacementfields on blog posts. - Team member CMS.
- Careers CMS with public application form.
- Contact form with Resend notification.
- Career application notification emails.
- Cloudinary uploads with route-based folders:
codeddevs-website/teamcodeddevs-website/productscodeddevs-website/blogscodeddevs-website/blogs/inline
- Admin image cropping before upload:
- Team photos: 1:1 square crop
- Product covers: 1200:630 landscape crop
- Blog covers: 1200:630 landscape crop
- Inline blog images: free crop
src/
app/
(public)/
admin/
api/
globals.css
layout.tsx
not-found.tsx
robots.ts
sitemap.ts
components/
admin/
blog/
careers/
contact/
layout/
sections/
ui/
db/
index.ts
queries.ts
schema.ts
migrations/
lib/
auth.ts
cloudinary.ts
email.ts
utils.ts
types/
index.tsRead AGENTS.md before making changes.
Important rules:
- Use pnpm only.
- Use server components by default.
- Use Drizzle ORM for database queries.
- Use Zod validation on API routes that accept input.
- Check authentication first on every admin API route.
- Use Cloudinary for content images.
- Use shared inline SVG icons from
src/components/ui/icons.tsx. - Do not install icon libraries.
- Do not use dark mode, gradients, or animations.
- Do not use "Projects"; the correct term is "Products".
- The
/blogroute must be labeled as "Updates" in user-facing UI. - Never commit secrets.
.env.localmust stay untracked.
GitHub Actions runs:
pnpm install --frozen-lockfilepnpm tsc --noEmitpnpm eslint src/ --ext .ts,.tsx --max-warnings 0pnpm build
The project is intended for Vercel.
Set all variables from .env.example in the Vercel dashboard. In production:
NEXTAUTH_URL=https://codeddevs.com- Never commit
.env.local. - Rotate any exposed credentials immediately.
- Admin routes are protected by middleware and API session checks.
- All PRs require review before merging.
CODEDDEVS TECHNOLOGY LTD
codeddevs.team@gmail.com