An open-source alternative to Claude Cowork
한국어 | English
- Node.js 22+
- pnpm 10+
- Rust (for the Tauri desktop app) — install via rustup
pnpm installcd apps/server
pnpm devThe server binds to 127.0.0.1 on a random port. The actual port is printed to the console as NEOS_PORT=<port> on startup.
cd apps/desktop
pnpm tauri devThis starts the Vite dev server (http://localhost:1420) and the Tauri window together.
Run from the repo root to build all packages and start all dev servers simultaneously:
pnpm devpnpm buildNEOS Work does not use .env files for secrets. API keys and other sensitive values are entered via the Settings page in the app UI and stored encrypted (AES-256-GCM) in ~/.neos-work/data.db.
Supported setting keys:
| Key | Description |
|---|---|
ANTHROPIC_API_KEY |
Anthropic Claude API key |
GOOGLE_API_KEY |
Google Gemini API key |
TAVILY_API_KEY |
Tavily web search API key |
SLACK_BOT_TOKEN |
Slack bot token |
DISCORD_WEBHOOK_URL |
Discord webhook URL |
KIS_APP_KEY / KIS_APP_SECRET |
Korea Investment & Securities API keys |
To set a key directly via the REST API:
curl -X PUT http://127.0.0.1:<PORT>/api/settings/ANTHROPIC_API_KEY \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <AUTH_TOKEN>" \
-d '{"value": "sk-ant-..."}'
PORTandAUTH_TOKENare printed to the console when the server starts.
You can control server behavior by exporting variables in your shell or passing them inline:
| Variable | Default | Description |
|---|---|---|
PORT |
random | Port the server listens on (OS-assigned if unset) |
Example (fixed port, standalone server):
cd apps/server
PORT=3000 pnpm devThe server does not auto-load
.envfiles. To use one, inject variables via a tool likedotenv-cli:npx dotenv-cli -e .env -- pnpm dev
| Command | Description |
|---|---|
pnpm lint |
Run ESLint |
pnpm typecheck |
TypeScript type checking |
pnpm format |
Format with Prettier |
pnpm clean |
Remove build artifacts and node_modules |