mirror of https://github.com/usememos/memos
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.7 KiB
7.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Memos is a self-hosted note-taking and knowledge management platform with a Go backend and React/TypeScript frontend. The architecture follows clean separation of concerns with gRPC APIs, REST gateway, and database abstraction.
Development Commands
Backend (Go)
# Run in development mode
go run ./bin/memos/main.go --mode dev --port 8081
# Build binary
go build -o ./build/memos ./bin/memos/main.go
# OR use build script
./scripts/build.sh
# Run tests
go test -v ./...
go test -cover ./...
# Run specific test packages
go test -v ./store/test/
go test -v ./server/router/api/v1/test/
Frontend (React/TypeScript)
cd web/
# Development server (http://localhost:3001)
pnpm dev
# Build for production
pnpm build
# Build for release (outputs to server/router/frontend/dist)
pnpm release
# Lint and type check
pnpm lint
Full Development Setup
- Backend:
go run ./bin/memos/main.go --mode dev --port 8081
- Frontend:
cd web && pnpm dev
- Access: Backend API at
http://localhost:8081
, Frontend athttp://localhost:3001
Architecture Overview
Backend Structure
/bin/memos/main.go
- Application entrypoint with CLI and server initialization/server/
- HTTP/gRPC server with Echo framework and cmux for protocol multiplexing/server/router/api/v1/
- gRPC services with REST gateway via grpc-gateway/store/
- Data access layer with multi-database support (SQLite/PostgreSQL/MySQL)/store/db/
- Database-specific implementations with shared interface/proto/
- Protocol buffer definitions for APIs and data models/internal/
- Shared utilities, profile management, and version handling/plugin/
- Modular plugins (S3 storage, OAuth, webhooks, etc.)
Frontend Structure
/web/src/
- React/TypeScript application/web/src/components/
- Reusable UI components with shadcn/ui/web/src/pages/
- Page-level components/web/src/store/
- MobX state management/web/src/types/
- TypeScript type definitions generated from protobuf
Key Architecture Patterns
Server Architecture
- Protocol Multiplexing: Single port serves both HTTP and gRPC via cmux
- gRPC-first: Core APIs defined in protobuf, REST via grpc-gateway
- Layered: Router → Service → Store → Database
- Middleware: Authentication, logging, CORS handled via interceptors
Database Layer
- Multi-database: Unified interface for SQLite, PostgreSQL, MySQL
- Migration System: Version-based schema migrations in
/store/migration/
- Driver Pattern:
/store/db/{sqlite,postgres,mysql}/
with common interface - Caching: Built-in cache layer for workspace settings, users, user settings
Authentication & Security
- JWT-based: Secret key generated per workspace
- gRPC Interceptors: Authentication middleware for all API calls
- Context Propagation: User context flows through request lifecycle
- Development vs Production: Different secret handling based on mode
Database Operations
Supported Databases
- SQLite (default):
--driver sqlite --data ./data
- PostgreSQL:
--driver postgres --dsn "postgres://..."
- MySQL:
--driver mysql --dsn "user:pass@tcp(host:port)/db"
Migration System
- Database schema managed via
/store/migration/{sqlite,postgres,mysql}/
- Automatic migration on startup via
store.Migrate(ctx)
- Version-based migration files (e.g.,
0.22/00__memo_tags.sql
)
Testing Approach
Backend Testing
- Store Tests:
/store/test/*_test.go
with in-memory SQLite - API Tests:
/server/router/api/v1/test/*_test.go
with full service setup - Test Helpers:
NewTestingStore()
for isolated database testingNewTestService()
for API integration testing
- Test Patterns: Context-based authentication, proper cleanup, realistic data
Frontend Testing
- Currently relies on TypeScript compilation and ESLint
- No dedicated test framework configured
Running Tests
# All tests
go test -v ./...
# Specific packages
go test -v ./store/test/
go test -v ./server/router/api/v1/test/
# With coverage
go test -cover ./...
Development Modes
Production Mode
go run ./bin/memos/main.go --mode prod --port 5230
- Uses workspace-generated secret key
- Serves built frontend from
/server/router/frontend/dist/
- Optimized for deployment
Development Mode
go run ./bin/memos/main.go --mode dev --port 8081
- Fixed secret key "usememos"
- Enables debugging features
- Separate frontend development server recommended
Demo Mode
go run ./bin/memos/main.go --mode demo
- Specialized configuration for demonstration purposes
Key Configuration
Environment Variables
All CLI flags can be set via environment variables with MEMOS_
prefix:
MEMOS_MODE
- Server mode (dev/prod/demo)MEMOS_PORT
- Server portMEMOS_DATA
- Data directoryMEMOS_DRIVER
- Database driverMEMOS_DSN
- Database connection stringMEMOS_INSTANCE_URL
- Public instance URL
Runtime Configuration
- Profile:
/internal/profile/
handles configuration validation - Secrets: Auto-generated workspace secret in production
- Data Directory: Configurable storage location for SQLite and assets
Frontend Technology Stack
Core Framework
- React 18 with TypeScript
- Vite for build tooling and development server
- React Router for navigation
- MobX for state management
UI Components
- Radix UI primitives for accessibility
- Tailwind CSS for styling with custom themes
- Lucide React for icons
- shadcn/ui component patterns
Key Libraries
- dayjs for date manipulation
- highlight.js for code syntax highlighting
- katex for math rendering
- mermaid for diagram rendering
- react-leaflet for maps
- i18next for internationalization
Protocol Buffer Workflow
Code Generation
- Source:
/proto/api/v1/*.proto
and/proto/store/*.proto
- Generated:
/proto/gen/
for Go,/web/src/types/proto/
for TypeScript - Build Tool: Buf for protobuf compilation
- API Docs: Generated swagger at
/proto/gen/apidocs.swagger.yaml
API Design
- gRPC services in
/proto/api/v1/
- Resource-oriented design (User, Memo, Attachment, etc.)
- REST gateway auto-generated from protobuf annotations
File Organization Principles
Backend
- Domain-driven: Each entity (user, memo, attachment) has dedicated files
- Layered: Clear separation between API, business logic, and data layers
- Database-agnostic: Common interfaces with driver-specific implementations
Frontend
- Component-based: Reusable components in
/components/
- Feature-based: Related functionality grouped together
- Type-safe: Strong TypeScript integration with generated protobuf types
Common Development Workflows
Adding New API Endpoint
- Define service method in
/proto/api/v1/{service}.proto
- Generate code:
buf generate
- Implement service method in
/server/router/api/v1/{service}_service.go
- Add any required store methods in
/store/{entity}.go
- Update database layer if needed in
/store/db/{driver}/{entity}.go
Database Schema Changes
- Create migration file in
/store/migration/{driver}/{version}/
- Update store interface in
/store/{entity}.go
- Implement in each database driver
- Update protobuf if external API changes needed
Frontend Component Development
- Create component in
/web/src/components/
- Follow existing patterns for styling and state management
- Use TypeScript for type safety
- Import and use in pages or other components