Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
name: Bug Report
about: Report a bug or unexpected behavior
title: "[Bug]: "
title: '[Bug]: '
labels: bug
assignees: ''
---
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
name: Feature Request
about: Suggest a new feature or improvement
title: "[Feature]: "
title: '[Feature]: '
labels: enhancement
assignees: ''
---
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Release
on:
push:
tags:
- "v*"
- 'v*'

# Ensure only one release runs at a time
concurrency:
Expand Down Expand Up @@ -50,8 +50,8 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
registry-url: "https://registry.npmjs.org"
node-version: '22'
registry-url: 'https://registry.npmjs.org'

- name: Install dependencies
run: npm ci
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ out
.eslintcache
*.log*
release
private/
CLAUDE.md
39 changes: 21 additions & 18 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ Thank you for your interest in contributing to openwork! This document provides
### Getting Started

1. Fork and clone the repository:

```bash
git clone https://github.com/YOUR_USERNAME/openwork.git
cd openwork
```

2. Install dependencies:

```bash
npm install
```
Expand Down Expand Up @@ -86,15 +88,15 @@ openwork uses a tactical/SCADA-inspired design system:

### Colors

| Role | Variable | Hex |
|------|----------|-----|
| Background | `--background` | `#0D0D0F` |
| Elevated | `--background-elevated` | `#141418` |
| Border | `--border` | `#2A2A32` |
| Critical | `--status-critical` | `#E53E3E` |
| Warning | `--status-warning` | `#F59E0B` |
| Nominal | `--status-nominal` | `#22C55E` |
| Info | `--status-info` | `#3B82F6` |
| Role | Variable | Hex |
| ---------- | ----------------------- | --------- |
| Background | `--background` | `#0D0D0F` |
| Elevated | `--background-elevated` | `#141418` |
| Border | `--border` | `#2A2A32` |
| Critical | `--status-critical` | `#E53E3E` |
| Warning | `--status-warning` | `#F59E0B` |
| Nominal | `--status-nominal` | `#22C55E` |
| Info | `--status-info` | `#3B82F6` |

### Typography

Expand Down Expand Up @@ -145,20 +147,21 @@ Use conventional commits:

We use labels to organize issues:

| Label | Description |
|-------|-------------|
| `bug` | Something isn't working |
| `enhancement` | New feature or improvement |
| `good first issue` | Good for newcomers |
| `help wanted` | Extra attention needed |
| `documentation` | Documentation improvements |
| `question` | Further information requested |
| `wontfix` | This will not be worked on |
| Label | Description |
| ------------------ | ----------------------------- |
| `bug` | Something isn't working |
| `enhancement` | New feature or improvement |
| `good first issue` | Good for newcomers |
| `help wanted` | Extra attention needed |
| `documentation` | Documentation improvements |
| `question` | Further information requested |
| `wontfix` | This will not be worked on |

## Questions?

Open an issue or start a discussion on GitHub.
changes

- `chore:` Build/tooling changes

## Questions?
Expand Down
39 changes: 34 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,44 @@ cd openwork
npm install
npm run dev
```
Or configure them in-app via the settings panel.

## Supported Models

| Provider | Models |
| --------- | ----------------------------------------------------------------- |
Currently we configure the below provider and models. You can add your own providers and models by configuring them with the
provider/model select button below the UI's chat input box.

| Provider | Models |
| --------- | -------------------------------------------------------------------------------------- |
| Anthropic | Claude Opus 4.5, Claude Sonnet 4.5, Claude Haiku 4.5, Claude Opus 4.1, Claude Sonnet 4 |
| OpenAI | GPT-5.2, GPT-5.1, o3, o3 Mini, o4 Mini, o1, GPT-4.1, GPT-4o |
| Google | Gemini 3 Pro Preview, Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite |
| OpenAI | GPT-5.2, GPT-5.1, o3, o3 Mini, o4 Mini, o1, GPT-4.1, GPT-4o |
| Google | Gemini 3 Pro Preview, Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite |

## Configuration

### API Keys

Configure API keys using one of these methods:

**In-App (Recommended):**

1. Open the Model Switcher (bottom left of chat)
2. Click a provider → "Configure API Key"
3. Enter your API key and save

**Settings Dialog:**

1. Click the gear icon to open Settings
2. Enter API keys for each provider

**Environment Variables:**

You can also set environment variables directly. Keys are stored in `~/.openwork/.env`.

| Provider | Environment Variable |
| --------- | -------------------- |
| Anthropic | `ANTHROPIC_API_KEY` |
| OpenAI | `OPENAI_API_KEY` |
| Google | `GOOGLE_API_KEY` |

## Contributing

Expand Down
1 change: 1 addition & 0 deletions bin/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ const child = spawn(electron, [mainPath, ...args], {
})

// Forward signals to child process
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type -- JS file
function forwardSignal(signal) {
if (child.pid) {
process.kill(child.pid, signal)
Expand Down
3 changes: 2 additions & 1 deletion electron.vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ import { readFileSync, copyFileSync, existsSync, mkdirSync } from 'fs'
import { defineConfig } from 'electron-vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
import type { Plugin } from 'vite'

const pkg = JSON.parse(readFileSync('./package.json', 'utf-8'))

// Plugin to copy resources to output
function copyResources() {
function copyResources(): Plugin {
return {
name: 'copy-resources',
closeBundle() {
Expand Down
34 changes: 17 additions & 17 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
import { defineConfig } from "eslint/config";
import tseslint from "@electron-toolkit/eslint-config-ts";
import eslintConfigPrettier from "@electron-toolkit/eslint-config-prettier";
import eslintPluginReact from "eslint-plugin-react";
import eslintPluginReactHooks from "eslint-plugin-react-hooks";
import eslintPluginReactRefresh from "eslint-plugin-react-refresh";
import { defineConfig } from 'eslint/config'
import tseslint from '@electron-toolkit/eslint-config-ts'
import eslintConfigPrettier from '@electron-toolkit/eslint-config-prettier'
import eslintPluginReact from 'eslint-plugin-react'
import eslintPluginReactHooks from 'eslint-plugin-react-hooks'
import eslintPluginReactRefresh from 'eslint-plugin-react-refresh'

export default defineConfig(
{ ignores: ["**/node_modules", "**/dist", "**/out"] },
{ ignores: ['**/node_modules', '**/dist', '**/out'] },
tseslint.configs.recommended,
eslintPluginReact.configs.flat.recommended,
eslintPluginReact.configs.flat["jsx-runtime"],
eslintPluginReact.configs.flat['jsx-runtime'],
{
settings: {
react: {
version: "detect",
},
},
version: 'detect'
}
}
},
{
files: ["**/*.{ts,tsx}"],
files: ['**/*.{ts,tsx}'],
plugins: {
"react-hooks": eslintPluginReactHooks,
"react-refresh": eslintPluginReactRefresh,
'react-hooks': eslintPluginReactHooks,
'react-refresh': eslintPluginReactRefresh
},
rules: {
...eslintPluginReactHooks.configs.recommended.rules,
...eslintPluginReactRefresh.configs.vite.rules,
},
...eslintPluginReactRefresh.configs.vite.rules
}
},
eslintConfigPrettier
);
)
1 change: 1 addition & 0 deletions resources/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Place your app icon here:
## Creating an Icon

You can create an icon using tools like:

- [Figma](https://figma.com)
- [IconKitchen](https://icon.kitchen)
- [MakeAppIcon](https://makeappicon.com)
Expand Down
Loading