Marketing site and product landing page for Upwely — a real-time indoor navigation system that guides warehouse workers to the exact shelf, bin, and item, eliminating search time and reducing picking errors by up to 94%.
This repository contains the public-facing website for Upwely. It includes the product landing page, feature showcase, pricing, an integrated blog, and a set of legal/marketing pages — all built on a modern, type-safe React stack and designed to score well on Core Web Vitals and SEO.
- Modern stack — Next.js 16 App Router, React 19, TypeScript 5, Tailwind CSS 4
- Smooth motion — Framer Motion for interactive sections and micro-interactions
- Content-driven blog — Markdown + frontmatter via
gray-matter, rendered withreact-markdownand GFM - SEO-first — JSON-LD structured data, dynamic
sitemap.tsandrobots.ts, OpenGraph and Twitter cards - Production-ready — Multi-stage Dockerfile with a non-root runtime
- Cloud-agnostic infra — Terraform stacks for GCP, AWS, and Azure
- Continuous delivery — GitHub Actions workflow for GCP deployments
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| UI | React 19, Tailwind CSS 4 |
| Language | TypeScript 5 |
| Animation | Framer Motion |
| Icons | Lucide |
| Content | gray-matter, react-markdown, remark-gfm |
| Tooling | ESLint 9, PNPM 9 |
| Container | Node 20 Alpine, multi-stage Docker build |
| Infra | Terraform (GCP / AWS / Azure) |
| CI/CD | GitHub Actions |
.
├── src/
│ ├── app/ # Next.js App Router pages & route handlers
│ │ ├── about/
│ │ ├── blog/
│ │ ├── changelog/
│ │ ├── contact/
│ │ ├── privacy-policy/
│ │ ├── terms-of-service/
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ ├── robots.ts
│ │ └── sitemap.ts
│ ├── components/ # Hero, Features, Pricing, Footer, SEO/JSON-LD, ...
│ ├── content/ # Markdown content (blog posts)
│ ├── lib/ # Shared utilities
│ └── middleware.ts
├── public/ # Static assets (icons, screenshots, og images)
├── terraform/ # Infrastructure-as-code for GCP, AWS, Azure
├── .github/workflows/ # CI/CD pipelines
├── Dockerfile
├── next.config.ts
└── package.json
- Node.js 20 or later
- PNPM 9 (recommended) —
npm install -g pnpm@9.15.0
git clone <repository-url>
cd Warehouse-Frontend
pnpm installpnpm devOpen http://localhost:3000 to view the site. Edits to
files under src/ hot-reload automatically.
pnpm build
pnpm startpnpm lintCreate a .env.local file in the project root for any local overrides:
NEXT_PUBLIC_SITE_URL=https://upwely.comNEXT_PUBLIC_SITE_URL is used to generate canonical URLs, sitemap entries, and
OpenGraph metadata. It defaults to https://upwely.com when unset.
Build and run the production image locally:
docker build -t upwely-web .
docker run --rm -p 3000:3000 upwely-webThe image uses a multi-stage build, runs as a non-root user, and ships only the Next.js standalone output for a small, secure runtime.
The workflow at .github/workflows/deploy-gcp.yml builds and deploys the
container to Google Cloud on push. See terraform/README.md for the matching
infrastructure setup.
Reusable infrastructure modules are provided for three clouds:
terraform/
├── aws/
├── azure/
└── gcp/
Pick the directory matching your target cloud, configure the required
variables, then run terraform init && terraform apply.
Blog posts live in src/content/blog as Markdown files with YAML frontmatter.
GitHub-flavored Markdown is supported via remark-gfm, and posts are rendered
through react-markdown. Adding a new post is as simple as dropping a new
.md file into the directory — it will appear in the sitemap and listing
automatically.
The site ships with first-class SEO out of the box:
- Per-page metadata via Next.js
MetadataAPI - Structured data (
Organization,WebSite,SoftwareApplication) as JSON-LD - Dynamic
sitemap.xmlandrobots.txtgenerated at build time - OpenGraph and Twitter Card images for rich social previews
- Create a feature branch off
master - Make your changes and run
pnpm lint - Open a pull request describing the change
Proprietary — © Upwely. All rights reserved.
Built with care by the Upwely team.