# GROWI Main Application (apps/app)
The main GROWI wiki application - a full-stack Next.js application with Express.js backend and MongoDB database.
## Technology Stack
| Layer | Technology |
|-------|------------|
| **Frontend** | Next.js 14 (Pages Router), React 18 |
| **Backend** | Express.js with custom server |
| **Database** | MongoDB with Mongoose ^6.13.6 |
| **State** | Jotai (UI state) + SWR (server state) |
| **API** | RESTful API v3 with OpenAPI specs |
| **Testing** | Vitest, React Testing Library |
## Quick Reference
### Essential Commands
```bash
# Development
pnpm run dev # Start dev server (or turbo run dev from root)
pnpm run dev:migrate # Run database migrations
# Quality Checks
pnpm run lint:typecheck # TypeScript type check
pnpm run lint:biome # Biome linter
pnpm run test # Run tests
# Build
pnpm run build # Build for production
# Run Specific Tests
pnpm vitest run yjs.integ # Use partial file name
pnpm vitest run helper.spec # Vitest auto-finds matching files
```
### Key Directories
```
src/
├── pages/ # Next.js Pages Router (*.page.tsx)
├── features/ # Feature modules (recommended for new code)
│ └── {feature-name}/
│ ├── server/ # Server-side (models, routes, services)
│ └── client/ # Client-side (components, hooks, states)
├── server/ # Express server (legacy structure)
│ ├── models/ # Mongoose models
│ ├── routes/apiv3/ # API v3 routes
│ └── services/ # Business logic
├── components/ # React components (legacy)
├── states/ # Jotai atoms
└── stores-universal/ # SWR hooks
```
## Development Guidelines
### 1. Feature-Based Architecture (New Code)
Create new features in `features/{feature-name}/`:
```
features/my-feature/
├── index.ts # Public exports
├── interfaces/ # TypeScript types
├── server/
│ ├── models/ # Mongoose models
│ ├── routes/ # Express routes
│ └── services/ # Business logic
└── client/
├── components/ # React components
├── hooks/ # Custom hooks
└── states/ # Jotai atoms
```
### 2. State Management
- **Jotai**: UI state (modals, forms, selections)
- **SWR**: Server data (pages, users, API responses)
```typescript
// Jotai for UI state
import { atom } from 'jotai';
export const isModalOpenAtom = atom(false);
// SWR for server data
import useSWR from 'swr';
export const usePageById = (id: string) => useSWR(`/api/v3/pages/${id}`);
```
### 3. Next.js Pages
Use `.page.tsx` suffix and `getLayout` pattern:
```typescript
// pages/admin/index.page.tsx
import type { NextPageWithLayout } from '~/interfaces/next-page';
const AdminPage: NextPageWithLayout = () => ;
AdminPage.getLayout = (page) => {page};
export default AdminPage;
```
### 4. API Routes (Express)
Add routes to `server/routes/apiv3/` with OpenAPI docs:
```typescript
/**
* @openapi
* /api/v3/pages/{id}:
* get:
* summary: Get page by ID
*/
router.get('/pages/:id', async (req, res) => {
const page = await PageService.findById(req.params.id);
res.json(page);
});
```
### 5. Path Aliases
Use `~/` for absolute imports:
```typescript
import { PageService } from '~/server/services/PageService';
import { Button } from '~/components/Button';
```
## Before Committing
```bash
pnpm run lint:typecheck # 1. Type check
pnpm run lint:biome # 2. Lint
pnpm run test # 3. Run tests
pnpm run build # 4. Verify build (optional)
```
## Key Features
| Feature | Directory | Description |
|---------|-----------|-------------|
| Page Tree | `features/page-tree/` | Hierarchical page navigation |
| OpenAI | `features/openai/` | AI assistant integration |
| Search | `features/search/` | Elasticsearch full-text search |
| Plugins | `features/growi-plugin/` | Plugin system |
| OpenTelemetry | `features/opentelemetry/` | Monitoring/telemetry |
## Skills (Auto-Loaded)
When working in this directory, these skills are automatically loaded:
- **app-architecture** - Directory structure, feature-based patterns
- **app-commands** - apps/app specific commands (migrations, OpenAPI, etc.)
- **app-specific-patterns** - Jotai/SWR/Next.js patterns, testing
Plus all global skills (monorepo-overview, tech-stack).
---
For detailed patterns and examples, refer to the Skills in `.claude/skills/`.
## Rules (Always Applied)
The following rules in `.claude/rules/` are always applied when working in this directory:
| Rule | Description |
|------|-------------|
| **package-dependencies** | Turbopack dependency classification — when to use `dependencies` vs `devDependencies`, verification procedure |