A world-class, dark premium landing page for StackOne — a software agency building extraordinary digital products across Africa and beyond. Built with Next.js 16, React 19, Tailwind CSS 4, and framer-motion.
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| UI | React 19, Tailwind CSS 4 |
| Animations | framer-motion, CSS Keyframes |
| Components | Radix UI, shadcn/ui |
| Language | TypeScript |
| Fonts | Satoshi (fontshare), JetBrains Mono (Google Fonts) |
| Icons | Material Symbols Outlined |
| Build | Bun runtime |
| Output | Static HTML (easy deployment anywhere) |
- Canvas Particle Network — Interactive hero particles with mouse repulsion
- Mouse-Tracking Gradient — Dynamic radial gradient that follows cursor position
- Custom Animated Cursor — Glow ring + dot cursor with hover state changes
- Scroll Progress Bar — Fixed progress indicator for page scroll position
- Scroll Reveal Animations — Intersection Observer-powered staggered entrance animations
- framer-motion Expertise Carousel — Spring-physics carousel for services section
- Animated Counters — Number count-up animations for stats
- Trust Marquee — Infinite scrolling client logos
- Tech Stack Grid — Interactive hover-glow tech capabilities grid
- Testimonials Carousel — Auto-playing testimonial slider
- Text Reveal — Word-by-word scroll-triggered text animation
- Parallax Images — Scroll-speed offset image components
- Glass Morphism Panels — Backdrop-blur cards with inner glow borders
- Logo-Featured Case Studies — 6 African-focused ventures with branded logos
- Dark Premium Theme — Custom design tokens with gradient text and glow effects
stackone/
├── src/
│ ├── app/
│ │ ├── page.tsx # Main landing page (all sections)
│ │ ├── layout.tsx # Root layout with fonts & metadata
│ │ ├── globals.css # Custom properties, animations, glass effects
│ │ └── api/route.ts # API route
│ ├── components/
│ │ ├── hero-particles.tsx # Canvas particle network
│ │ ├── mouse-gradient.tsx # Cursor-following gradient
│ │ ├── premium-cursor.tsx # Custom animated cursor
│ │ ├── scroll-progress.tsx # Scroll progress bar
│ │ ├── scroll-reveal.tsx # Scroll-triggered animations
│ │ ├── expertise-carousel.tsx # framer-motion carousel
│ │ ├── animated-counter.tsx # Number count-up
│ │ ├── trust-marquee.tsx # Infinite logo scroll
│ │ ├── tech-stack.tsx # Interactive tech grid
│ │ ├── testimonials.tsx # Testimonial carousel
│ │ ├── text-reveal.tsx # Word-by-word reveal
│ │ ├── parallax-image.tsx # Parallax scroll images
│ │ ├── aurora-background.tsx # Aurora gradient bg
│ │ ├── spotlight-card.tsx # Hover spotlight card
│ │ └── ui/ # shadcn/ui components
│ ├── hooks/
│ └── lib/
├── public/
│ └── images/ # Logos, team portraits, venture images
├── next.config.ts
├── tailwind.config.ts
├── tsconfig.json
└── package.json
- Node.js >= 18.17 (or Bun >= 1.0)
- npm, yarn, pnpm, or bun
# Clone the repository
git clone https://github.com/CHAMA18/stackone.git
cd stackone
# Install dependencies
npm install
# or with bun
bun installnpm run dev
# or
bun devOpen http://localhost:3000 in your browser.
npm run build
# Static files output to: out/This project exports as static HTML (out/ directory). Deploy it anywhere that serves static files — no Node.js server needed.
Publish Directory: out
- Go to render.com → New → Static Site
- Connect your GitHub repo
CHAMA18/stackone - Set:
- Build Command:
npm install && npm run build - Publish Directory:
out
- Build Command:
- Click Create Static Site
Your site will be live at https://stackone-xxxx.onrender.com
Vercel is the official platform from the creators of Next.js and offers zero-config deployment.
- Go to vercel.com and sign in with GitHub
- Click "Add New Project" and select the
stackonerepository - Framework Preset: Next.js (auto-detected)
- Click "Deploy" — Vercel handles the rest
- Your site will be live at
https://stackone-<hash>.vercel.app
Custom Domain: In Vercel dashboard → Settings → Domains → Add your custom domain
- Go to app.netlify.com → "Add new site" → "Import an existing project"
- Select the
stackoneGitHub repo - Set:
- Build Command:
npm run build - Publish Directory:
out
- Build Command:
- Click "Deploy"
- Go to dash.cloudflare.com → Pages → Create a project
- Connect GitHub → Select
stackone - Set:
- Build Command:
npm run build - Build output directory:
out
- Build Command:
- Click "Save and Deploy"
- Create
.github/workflows/deploy.yml:
name: Deploy to GitHub Pages
on:
push:
branches: [main]
permissions:
contents: read
pages: write
id-token: write
jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
cache: npm
- run: npm ci
- run: npm run build
- uses: actions/upload-pages-artifact@v3
with:
path: ./out
- uses: actions/deploy-pages@v4- Go to repo Settings → Pages → Source: GitHub Actions
npm install && npm run build
# Upload the "out/" folder to any static hostCreate a .env.local file for any environment-specific configuration:
# Example — add your own keys as needed
NEXT_PUBLIC_SITE_URL=https://stackone.africaNote: The landing page runs without any required environment variables. All data is statically generated.
Edit the CSS custom properties in src/app/globals.css:
:root {
--primary-h: 220; /* Hue */
--primary-s: 80%; /* Saturation */
--primary-l: 55%; /* Lightness */
}All section content lives in src/app/page.tsx as typed constants at the top of the file:
STATS— Hero statisticsVENTURES— Case studies with logos, descriptions, and metricsAPPROACH_STEPS— Methodology stepsTEAM— Team members with portraits- Navigation links and footer content
Drop your images into public/images/ and update the corresponding paths in the data constants.
MIT
Built by Chungu Chipimo Chama — StackOne
