The official marketing website for Code Editor Land - The Next-Generation Code Editor
WebSite is the official marketing and download portal for Code Editor Land, a post-Electron, Rust + Tauri-powered code editor that forks VSCode. This repository contains a fully dynamic, translation-ready website built with modern web technologies.
- Dynamic Component System - Content-driven components using TypeScript schemas
- Full i18n Support - 8 translation namespaces with English complete
- Design System Compliance - Enforced 3px borders, no border-radius, strict contrast
- Responsive Layout - Mobile-first design with adaptive grid systems
- SEO Optimized - Meta tags, sitemap generation, Open Graph support
- Fast Builds - Astro 5 with Vite for instant HMR and optimized production builds
- Cloudflare Workers Integration - Full-stack backend services for auth, downloads, analytics, and status monitoring
| Layer | Technology | Version |
|---|---|---|
| Framework | Astro | 5.x |
| UI Library | React | 19.2 |
| Language | TypeScript | 5.x |
| Styling | Tailwind CSS | 3.x |
| Components | shadcn/ui | Latest |
| Icons | Lucide React | 0.487 |
| Build Tool | Vite | 6.x |
| i18n | i18next | 24.x |
| Backend | Cloudflare Workers | - |
| Database | Cloudflare KV | - |
| Storage | Cloudflare R2 | - |
The Code Editor Land website adheres to strict design principles:
--border-width: 3px; /* All UI elements */
--border-radius: 0; /* No radius except badges/avatars */
--contrast: white on black /* High contrast mode */Enforced globally in Source/Stylesheet/Base.css
WebSite/
βββ Source/ # Main source code (Astro)
β βββ Components/
β β βββ Dynamic/ # Dynamic content-driven components
β β β βββ types.tsx # Central TypeScript schemas
β β β βββ DynamicButton.tsx
β β β βββ DynamicCard.tsx
β β β βββ DynamicHeroSection.tsx
β β β βββ DynamicFeatures.tsx
β β β βββ DynamicPricing.tsx
β β β βββ DynamicTestimonials.tsx
β β β βββ DynamicBadge.tsx
β β β βββ DynamicInput.tsx
β β β βββ DynamicLabel.tsx
β β β βββ DynamicCheckbox.tsx
β β β βββ DynamicTable.tsx
β β β βββ DynamicPlatformGrid.tsx
β β β βββ DynamicSystemRequirements.tsx
β β β βββ DynamicVerificationInfo.tsx
β β β βββ DynamicPreviousReleases.tsx
β β β βββ DynamicSignIn.tsx
β β β βββ DynamicSignUp.tsx
β β β βββ DynamicForgotPassword.tsx
β β β βββ DynamicResetPassword.tsx
β β β βββ DynamicEmailVerification.tsx
β β β βββ DynamicMetaTags.tsx
β β βββ Layout/
β β β βββ Header.tsx
β β β βββ Footer.tsx
β β βββ Marketing/
β β β βββ Hero.tsx
β β β βββ Features.tsx
β β β βββ Pricing.tsx
β β β βββ Testimonials.tsx
β β βββ Download/
β β β βββ DownloadCard.tsx
β β β βββ PlatformGrid.tsx
β β βββ Auth/
β β β βββ SignIn.tsx
β β β βββ SignUp.tsx
β β β βββ ForgotPassword.tsx
β β β βββ ResetPassword.tsx
β β β βββ EmailVerification.tsx
β β βββ ui/ # shadcn/ui components (do not modify)
β β β βββ button.tsx
β β β βββ badge.tsx
β β β βββ card.tsx
β β β βββ input.tsx
β β β βββ label.tsx
β β β βββ checkbox.tsx
β β β βββ table.tsx
β β β βββ ... (46 total)
β β βββ Social/
β β β βββ MetaTags.tsx
β β βββ index.ts
β βββ Lib/
β β βββ I18n/
β β β βββ index.ts # i18n initialization
β β β βββ Client.ts
β β β βββ Server.ts
β β β βββ types.ts
β β β βββ Locales/
β β β βββ En/
β β β β βββ Common.json
β β β β βββ Home.json
β β β β βββ Download.json
β β β β βββ Account.json
β β β β βββ Header.json
β β β β βββ Footer.json
β β β β βββ Meta.json
β β β β βββ Verify.json
β β β βββ [locale]/
β β βββ api/
β β β βββ auth.ts
β β β βββ downloads.ts
β β β βββ status.ts
β β β βββ analytics.ts
β β β βββ index.ts
β β βββ UseTranslation.ts
β β βββ types.ts
β βββ pages/
β β βββ index.astro # Homepage (/)
β β βββ downloads.astro # Downloads page (/downloads)
β β βββ verify.astro # Email verification (/verify)
β β βββ 404.astro # 404 page
β β βββ account/
β β βββ signin.astro
β β βββ signup.astro
β β βββ forgot-password.astro
β β βββ reset-password.astro
β βββ Stylesheet/
β β βββ Base.css # Global design tokens
β βββ Function/
β β βββ TailWind/Color.ts
β β βββ Scroll/Layout.astro
β βββ env.d.ts
βββ plans/ # Design specifications & content plans
β βββ Data/
β β βββ TranslationKeys.json # Master translation key definitions
β β βββ DesignTokens.md
β βββ Pages/
β βββ HomePage.md
β βββ DownloadsPage.md
β βββ AccountPage.md
βββ Documentation/ # External module documentation
βββ Asset/ # Static assets
βββ .github/ # GitHub workflows & templates
βββ package.json
βββ pnpm-workspace.yaml
βββ tsconfig.json
βββ astro.config.mjs
βββ tailwind.config.mjs
βββ README.md # This file
- Node.js 20.x or higher
- pnpm 9.x (recommended) or npm/yarn
- Git
# Clone the repository
git clone https://github.com/CodeEditorLand/WebSite.git
cd WebSite
# Install dependencies
pnpm install
# Copy environment variables (if needed)
cp .env.example .env# Start dev server with HMR
pnpm dev
# Or using npm
npm run dev
# Access at http://localhost:4321# Create production build
pnpm build
# Output directory: Target/# Serve built site locally
pnpm preview
# Or directly serve Target/ directory
npx serve TargetWebSite integrates with a suite of Cloudflare Workers to provide full-stack functionality:
| Worker | Port | Purpose |
|---|---|---|
| Auth Worker | 8787 | User authentication, registration, OAuth, session management |
| Download Worker | 8788 | Binary distribution, version management, file serving |
| Analytics Worker | 8789 | Event tracking, page views, statistics |
| Status Worker | 8790 | System status monitoring, GitHub integration |
- Start the Workers (in
Workers/directory):
cd Workers
pnpm dev- Configure environment variables in
WebSite/.env:
PUBLIC_AUTH_WORKER_URL=http://localhost:8787
PUBLIC_DOWNLOAD_WORKER_URL=http://localhost:8788
PUBLIC_ANALYTICS_WORKER_URL=http://localhost:8789
PUBLIC_STATUS_WORKER_URL=http://localhost:8790
PUBLIC_FRONTEND_URL=http://localhost:4321- Access the integrated website at
http://localhost:4321
- Authentication: Full sign-up, sign-in, password reset, email verification, and OAuth (GitHub, Google, GitLab)
- Downloads: Dynamic binary listing, version history, SHA-256 verification, PGP signatures, and download tracking
- Analytics: Automatic page view tracking, custom event support via
useAnalytics()hook - Session Management: Persistent sessions with automatic token refresh
See API_CONTRACT.md for comprehensive API reference, endpoint specifications, request/response examples, and error handling.
Components accept content schemas (TypeScript interfaces) instead of hardcoded props. This enables:
- Content decoupling - Change content without touching component code
- Type safety - Full TypeScript IntelliSense for content structures
- i18n ready - Content can be loaded from translation files
- Reusability - Same component, multiple content variations
import { DynamicButton } from "./Components/Dynamic/DynamicButton";
import type { ButtonContent } from "./Components/Dynamic/types";
const buttonContent: ButtonContent = {
text: "Get Started",
variant: "default",
size: "lg",
fullWidth: true,
icon: "ArrowRight",
onClick: () => console.log("Clicked!")
};
// Render
<DynamicButton content={buttonContent} />| Component | Purpose | Key Props |
|---|---|---|
DynamicButton |
Action button | text, variant, size, icon |
DynamicBadge |
Status indicators | text, variant, showDot |
DynamicCard |
Content container | sections (header/body/footer) |
DynamicInput |
Form input | label, placeholder, type, error |
DynamicLabel |
Form label | text, htmlFor, required |
DynamicCheckbox |
Checkbox input | label, description, checked |
DynamicTable |
Data table | columns, data, striped |
DynamicHeroSection |
Landing hero | title, cta, floatingCards |
DynamicFeatures |
Feature grid | items[] with icon/title/description |
DynamicPricing |
Pricing tiers | plans[] with price/features |
DynamicTestimonials |
Testimonials carousel | testimonials[] |
DynamicPlatformGrid |
Download cards | platforms[] with metadata |
DynamicSystemRequirements |
System specs | requirements (min/recommended) |
DynamicVerificationInfo |
Binary verification | sha256, pgpSignature |
DynamicPreviousReleases |
Version history table | releases[] with assets |
DynamicSignIn |
Sign-in form | emailField, passwordField |
DynamicSignUp |
Sign-up form | emailField, passwordField, termsCheckbox |
DynamicForgotPassword |
Password reset request | emailField |
DynamicResetPassword |
Set new password | passwordField, confirmPasswordField |
DynamicEmailVerification |
Verify email | pending, success, error states |
DynamicMetaTags |
SEO meta tags | title, description, ogImage |
Website uses i18next with namespace-based translation files stored in:
Source/Lib/I18n/Locales/{locale}/{namespace}.json
| Namespace | Status | Keys |
|---|---|---|
common |
Complete | 38 |
home |
Complete | 167 |
download |
Complete | 65 |
account |
Complete | 185 |
header |
Complete | 12 |
footer |
Complete | 50 |
meta |
Complete | 24 |
verify |
Complete | 46 |
Total: 587 translation keys across 8 namespaces (English complete)
- Define keys in
plans/Data/TranslationKeys.json - Add content to
Source/Lib/I18n/Locales/En/{namespace}.json - Use in components:
import { useTranslation } from "@/Lib/UseTranslation";
function MyComponent() {
const { t } = useTranslation("home");
return <h1>{t("hero.title")}</h1>;
}All components must adhere to these design tokens defined in Source/Stylesheet/Base.css:
:root {
--border-width: 3px; /* All borders */
--border-radius: 0; /* No rounded corners */
--font-sans: "Inter", system-ui, sans-serif;
--font-mono: "JetBrains Mono", monospace;
}
/* Global enforcement */
* {
border-radius: var(--border-radius) !important;
}
.border {
border-width: var(--border-width);
}We use shadcn/ui primitives located in Source/Components/ui/. These are NOT to be modified directly. Instead:
- DO wrap them in dynamic components
- DO apply design-token classes
- DON'T change base component props/styles
| Alias | Tailwind | Usage |
|---|---|---|
sm |
640px | Mobile landscape |
md |
768px | Tablet |
lg |
1024px | Laptop |
xl |
1280px | Desktop |
2xl |
1536px | Large screens |
| Route | Astro File | Purpose |
|---|---|---|
/ |
pages/index.astro |
Homepage with hero, features, pricing |
/downloads |
pages/downloads.astro |
Downloads page with platform cards, requirements, verification |
/account/signin |
pages/account/signin.astro |
User authentication |
/account/signup |
pages/account/signup.astro |
New user registration |
/account/forgot-password |
pages/account/forgot-password.astro |
Request password reset |
/account/reset-password |
pages/account/reset-password.astro |
Set new password (with token) |
/verify |
pages/verify.astro |
Email verification status |
/404 |
pages/404.astro |
Not found page |
Account pages use the <AccountPage> wrapper component that renders the appropriate form based on the route prop.
Content is embedded directly in page files (*.astro) as JavaScript/TypeScript objects:
---
// pages/index.astro
import { HomePage } from "../Components/Dynamic/HomePage";
import { useTranslation } from "../Lib/UseTranslation";
const { t } = useTranslation("home");
const pageContent = {
hero: {
title: t("hero.title"),
subtitle: t("hero.subtitle"),
// ...
},
features: {
items: [
{
icon: "Zap",
title: t("features.item.designTokens.title"),
// ...
},
// ...
]
},
// ...
---
<HomePage content={pageContent} />Planned API endpoints for content management:
| Endpoint | Method | Purpose |
|---|---|---|
GET /api/content/home |
GET | Fetch homepage content |
GET /api/content/download |
GET | Fetch download page |
POST /api/auth/signin |
POST | User authentication |
POST /api/auth/signup |
POST | User registration |
POST /api/auth/forgot-password |
POST | Request password reset |
POST /api/auth/reset-password |
POST | Reset with token |
GET /api/verify-email |
GET | Verify email address |
GET /api/download/:platform |
GET | Binary download (with headers) |
| File | Purpose |
|---|---|
astro.config.mjs |
Astro settings, integrations, output format |
tsconfig.json |
TypeScript strict mode, paths |
tailwind.config.mjs |
Tailwind setup, content paths, custom theme |
pnpm-workspace.yaml |
Monorepo workspace configuration |
package.json |
Dependencies and scripts |
.env.example |
Environment variable template |
{
"scripts": {
"dev": "astro dev --port 4321", // Dev server
"build": "astro build", // Production build
"preview": "astro preview", // Preview build
"generate": "astro build --generate", // Static generation
"lint": "eslint . --ext .ts,.tsx,.astro",// Lint code
"format": "prettier --write .", // Format code
"typecheck": "tsc --noEmit", // Type check only
"clean": "rm -rf Target node_modules/.cache"
}
}pnpm typecheckCurrent status: Warnings only - Build succeeds despite strict mode warnings.
pnpm lintPlanned: Playwright visual tests in tests/ directory.
- Vercel - Zero-config Astro deployment
- Netlify - Static site support
- Cloudflare Pages - Edge-optimized
- GitHub Pages - Free static hosting
Target/
βββ index.html
βββ downloads.html
βββ account/
β βββ signin.html
β βββ signup.html
β βββ forgot-password.html
β βββ reset-password.html
βββ verify.html
βββ 404.html
βββ sitemap-index.xml
βββ assets/
β βββ images/
β βββ css/
β βββ js/
β βββ svg/
βββ robots.txt
Required for production:
PUBLIC_SITE_URL=https://Editor.Land
PUBLIC_APP_NAME=LandOptional:
# API endpoints (if implementing backend)
PUBLIC_API_URL=https://api.Editor.Land
PUBLIC_VERIFY_URL=https://verify.Editor.LandWe welcome contributions! Please read CONTRIBUTING.md for detailed development workflow, coding standards, and pull request process.
Key guidelines:
- TypeScript strict mode - No
any, explicit return types - PascalCase - Files, components, interfaces
- kebab-case - URLs, CSS classes
- Prettier - Auto-format on commit
- ESLint - Follow rules in configuration files
- Define interface in
types.tsx - Implement component in appropriate category with
contentprop - Add translations to all locale files
- Update component documentation
- Test with real content in a page
- Fork repository
- Create feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open PR with description and screenshots
The project uses strict: true and exactOptionalPropertyTypes: true, which produces warnings for:
- Unused imports/variables
- Optional callback types requiring explicit
undefined - Index signature access patterns
These warnings do NOT block builds. Critical type errors would fail compilation.
If frontend cannot connect to Workers:
- Verify Workers are running:
cd Workers && pnpm dev - Check
WebSite/.envhas correct URLs (matching Worker ports) - Ensure
FRONTEND_URLis set in Worker environment - Check CORS configuration - Workers automatically add CORS headers based on
FRONTEND_URL
# Clean and rebuild all
cd WebSite
rm -rf .astro node_modules
pnpm install
pnpm prepublishOnlyCheck for missing dependencies or TypeScript errors.
All UI components must enforce design system constraints:
- Borders: Use
border-[3px]orborder border-border- never plainborder - Radius: Use
!rounded-none- badges are exception withrounded-full - Colors: Use theme colors (
bg-primary,text-foreground,border-border) for dark/light mode support
- COMPONENT_CATALOG.md - Complete component reference with props, i18n, status
- API_CONTRACT.md - Workers API specification
- ARCHITECTURE.md - System architecture overview
- DEPLOYMENT.md - Production deployment guide
- CONTRIBUTING.md - Development workflow and guidelines
Detailed documentation for third-party modules is available in Documentation/Module/:
- radix-ui-themes - Theming system
High-level design and implementation plans:
plans/SUMMARY.md- Feature overviewplans/IMPLEMENTATION_TASKS.md- Task breakdownplans/HANDOFF_TO_AGENT.md- Agent implementation guideplans/Data/TranslationKeys.json- Translation schema
This project is licensed under the MIT License - see LICENSE for details.
- Documentation: https://docs.Editor.Land
- Issues: https://github.com/CodeEditorLand/WebSite/issues
- Discord: Land Community
- Email: support@Editor.Land
Built by the Code Editor Land team