A powerful markdown-based workspace and knowledge management system with Git integration.
- π Markdown-First: Organize your documents using markdown files with frontmatter metadata
- ποΈ Smart Workspaces: Automatically organize files into workspaces based on frontmatter
- π Git Integration: Full version control support with commit history and diff viewing
- π¨ Rich Editor: Built-in Milkdown editor with live preview
- π Fast Search: Powerful file search using ripgrep
- π§ RESTful API: Comprehensive V1 API for all operations
- πΎ Local Storage: Settings stored locally for better performance
npm install -g turbometurbome start
# or simply
turbomeThe server will start on port 7788 by default. Open your browser and navigate to:
- Frontend: http://localhost:7788
- API Documentation: http://localhost:7788/api-docs
turbome --help # Show help
turbome --version # Show version
turbome start # Start the server (default)PORT=8080 turbome # Use custom port (default: 7788)
STORAGE_DIR=/path/to/files turbome # Set storage directory- Navigate to the Explore page
- Click "New Item" in any workspace
- Files are automatically created with timestamps as filenames
Workspaces are automatically created based on the workspace field in markdown frontmatter:
---
workspace: my-project
title: My Document
---
# Content hereFiles can be transferred between workspaces using the transfer button:
- Click the transfer icon next to any file
- Select target workspace or create a new one
- File's frontmatter is automatically updated
Archive files by removing them from workspaces:
- Click the archive button on any file
- The file's workspace frontmatter is removed
- File remains in the filesystem but not shown in workspaces
TurboMe provides a comprehensive RESTful API:
GET /api/v1/workspaces- List all workspacesGET /api/v1/files/markdown- Get markdown filesPUT /api/v1/files/markdown- Save markdown filesPUT /api/v1/files/markdown/frontmatter- Update frontmatterDELETE /api/v1/files/markdown/frontmatter- Delete frontmatter fields
// Get all workspaces
fetch('http://localhost:7788/api/v1/workspaces')
.then(res => res.json())
.then(data => console.log(data));- Node.js >= 18
- npm >= 9
# Clone the repository
git clone https://github.com/gitbase-ai/turbome.ai.git
cd turbome.ai
# Install dependencies
npm install
# Start development servers
npm run devThis starts:
- Frontend dev server on http://localhost:3000
- Backend dev server on http://localhost:7788
npm run build:distnpm test- Framework: Next.js 15 with TypeScript
- Styling: Tailwind CSS 4
- Features: App Router, Turbopack, ESLint
- Framework: NestJS with TypeScript
- Features: REST API, CORS enabled, modular architecture
- Port: 3001
- Types: Common interfaces and types
- DTOs: Data Transfer Objects with validation
- Constants: API endpoints, HTTP status codes, etc.
- π― Type Safety: End-to-end TypeScript with shared types
- π Fast Development: Hot reloading for both frontend and backend
- π¦ Monorepo: Efficient dependency management with npm workspaces
- π Code Sharing: Common types and utilities across applications
- π¨ Modern Stack: Latest versions of Next.js and NestJS
- π No CORS Issues: Frontend proxies API requests to backend
Backend serves all endpoints under /api prefix:
GET /api- Welcome messageGET /api/health- Health check
GET /api/users- Get all usersPOST /api/users- Create userGET /api/users/:id- Get user by IDPUT /api/users/:id- Update userDELETE /api/users/:id- Delete user
GET /api/files?file_paths=["file.txt"]- Get files content (always returns list format)GET /api/files?file_paths=["a.txt","b.txt"]- Get multiple files contentGET /api/files?file_paths=["file.txt"]&metadata_only=true- Get file metadata onlyPUT /api/files?file_path=path- Create or update fileDELETE /api/files?file_path=path- Delete file
File paths examples:
- Single file:
?file_paths=["test.txt"]β Returns{ files: [...], total_count: 1, success_count: 1, error_count: 0 } - Multiple files:
?file_paths=["file1.txt","folder/file2.txt"]β Returns list format with all files - With encoding:
?file_paths=["file.txt"]&encoding=base64 - Metadata only:
?file_paths=["file.txt"]&metadata_only=true
Response format:
{
"success": true,
"data": {
"files": [{ "file_name": "test.txt", "content": "...", ... }],
"total_count": 1,
"success_count": 1,
"error_count": 0,
"errors": []
}
}Note:
- Backend serves at:
http://localhost:3001/api/* - Frontend proxies
/api/*tohttp://localhost:3001/api/*
Interactive Swagger documentation is available when running the server:
http://localhost:3001/api/docs
http://localhost:7788/api/docs
The Swagger UI provides:
- Complete API endpoint documentation
- Request/response schemas
- Interactive testing interface
- Authentication support (if configured)
Settings are stored in browser localStorage:
- Draft Path: Default location for new files (default:
./drafts)
Access settings at: http://localhost:7788/settings/explore
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License.
Found a bug or have a suggestion? Please open an issue at GitHub Issues.
Made with β€οΈ by TurboMe Contributors
- Frontend: Next.js dev server on port 3000
- Backend: NestJS dev server on port 3001
- Frontend proxies
/api/*to backend
npm run dev- Single NestJS server serves everything on port 7788
- Static frontend files are served by NestJS
- API endpoints available at
/api/*
npm run build:dist
./cli/index.js-
Build the package:
npm run build:dist
-
Check the build:
./scripts/publish.sh
-
Publish to npm:
npm publish
Create .env.local files as needed:
NEXT_PUBLIC_API_URL=http://localhost:3001PORT=3001
CLIENT_URL=http://localhost:3000PORT=7788 # Server port (default: 7788)
NODE_ENV=production # Automatically set by CLIThe project includes shared TypeScript types and a ready-to-use API client for type-safe frontend-backend communication.
import { FilesApiClient, GetFilesResponse } from '@shared/index';
// Create API client
const filesApi = new FilesApiClient('/api');
// Type-safe API calls
const response: GetFilesResponse = await filesApi.getFile('test.txt');
const multipleFiles = await filesApi.getFiles({
file_paths: ['file1.txt', 'file2.txt'],
encoding: 'text'
});
// Save file with full type safety
await filesApi.saveFile({
file_path: 'new-file.txt',
content: 'Hello World',
commit_message: 'Create new file'
});- Request/Response Types:
GetFilesRequest,SaveFileRequest, etc. - Data Models:
FileInfo,MultipleFilesResponse, etc. - API Client:
FilesApiClientwith all methods - Common Types:
ApiResponse,User, etc.
- β Type Safety: IntelliSense and compile-time checks
- β Consistency: Same types across frontend and backend
- β DX: Better developer experience with autocomplete
- β Maintainability: Single source of truth for API contracts
- Required: Must set
STORAGE_DIRenvironment variable - Example:
STORAGE_DIR=/path/to/files npm run dev - Error: Server will fail to start without
STORAGE_DIRin development
- Default: Current working directory where CLI is executed
- Example:
# Files stored in current directory turbome