- Node.js >= 22.0.0
- pnpm (recommended package manager)
- Git for version control
git clone <repository-url>
cd ocobo-websitepnpm installpnpm prepareCreate a .env.local file:
# Content Source (local for dev, github for prod)
CONTENT_SOURCE=locale
# To use GitHub as source (optional in dev)
GITHUB_ACCOUNT=your-account
GITHUB_REPO=your-content-repo
GITHUB_ACCESS_TOKEN=your-token
GITHUB_BRANCH=main
# AGO Chat widget (optional)
AGO_API_KEY=your-key
AGO_BASEPATH=your-base-path# Uses local files from ~/projects/ocobo-posts/
pnpm dev:local# Uses GitHub API (like production)
pnpm dev:github# Start development server
pnpm dev # Automatic source based on CONTENT_SOURCE
pnpm dev:local # Force use of local files
pnpm dev:github # Force use of GitHub API
# Generate style system (after token changes)
pnpm prepare
# Code verification
pnpm check # Linting and formatting
pnpm check:fix # Automatic fix
pnpm typecheck # Type verificationpnpm test # Unit tests
pnpm test:watch # Tests in watch mode
pnpm test:coverage # Code coveragepnpm build # Production build
pnpm start # Start production server
pnpm build:analyze # Bundle analysis├── app/ # Application code
│ ├── routes/ # React Router routes
│ ├── components/ # React components
│ ├── modules/ # Business logic
│ └── localization/ # Internationalization
├── preset/ # Panda CSS design system
├── docs/ # Documentation
├── public/ # Static assets
└── locales/ # Translation files
- Consult the Architecture Overview
- Explore the Component Inventory
- Analyze existing components
- Create or modify necessary components
- Test with
pnpm test - Verify quality with
pnpm check - Validate types with
pnpm typecheck
// Using design tokens
import { css } from '@ocobo/styled-system/css';
import { Button } from '@ocobo/styled-system/jsx';
// Dynamic styles
const dynamicStyle = css({
backgroundColor: 'coral.light',
padding: 'md',
});
// Components with recipes
<Button variant="primary" size="md">Click me</Button>// Fetching content
import { fetchBlogposts } from '~/modules/content';
export const loader = createHybridLoader(async () => {
const [status, state, data] = await fetchBlogposts();
return { posts: data || [] };
}, 'blogPost');# Clean and regenerate
rm -rf node_modules .react-router build
pnpm install
pnpm prepare
pnpm build# Add ?refresh=1 to the URL
http://localhost:3000/blog?refresh=1# Regenerate React Router types
pnpm typecheck- Operational Guide - Advanced commands and deployment
- API Contracts - Endpoint documentation
- Component Inventory - UI component catalog
- Architecture - Patterns and best practices
- Documentation: Check files in
/docs - Issues: Create a ticket to report problems
- Code Review: Follow standards defined by Biome
Happy coding! 🚀