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
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
<table>
<tr>
<td align="center"><b>✨ Mermaid → Icons</b><br/><sub>Paste Mermaid · 1,600+ icons<br/>auto-assigned · beautiful</sub></td>
<td align="center"><b>🤖 AI Generation</b><br/><sub>10 providers inc. local Ollama<br/>Direct-to-canvas output</sub></td>
<td align="center"><b>🤖 AI Generation</b><br/><sub>11 providers inc. local Ollama<br/>Direct-to-canvas output</sub></td>
<td align="center"><b>`{}` Diagram as Code</b><br/><sub>Bidirectional live sync<br/>Git-friendly DSL</sub></td>
<td align="center"><b>🧩 Asset Libraries</b><br/><sub>Developer · AWS · Azure<br/>GCP · CNCF · Icons</sub></td>
<td align="center"><b>🎬 Cinematic MP4</b><br/><sub>WebCodecs H.264<br/>Faster-than-realtime</sub></td>
Expand Down Expand Up @@ -108,7 +108,7 @@ Every diagramming tool makes a compromise. OpenFlowKit doesn't.
| **Lucidchart / Miro** | Cloud lock-in — expensive, account required, your data lives on their servers |
| **PlantUML** | Server-dependent rendering — no visual editor, no local-first model |

OpenFlowKit is the **only MIT-licensed tool** that combines a real workspace home, a professional visual canvas, bidirectional diagram-as-code, AI generation from 10 providers (including fully-local Ollama), **automatic icon assignment from 1,600+ tech icons**, anchored auto-layout, hardware-encoded cinematic MP4 export, and a Model Context Protocol server so Claude / Cursor / Windsurf can drive it directly — all with zero server-side storage.
OpenFlowKit is the **only MIT-licensed tool** that combines a real workspace home, a professional visual canvas, bidirectional diagram-as-code, AI generation from 11 providers (including fully-local Ollama), **automatic icon assignment from 1,600+ tech icons**, anchored auto-layout, hardware-encoded cinematic MP4 export, and a Model Context Protocol server so Claude / Cursor / Windsurf can drive it directly — all with zero server-side storage.

---

Expand All @@ -118,7 +118,7 @@ OpenFlowKit is the **only MIT-licensed tool** that combines a real workspace hom
| ------------------------------------- | :---------: | :--------: | :-----: | :-----: | :--------: |
| Visual canvas editor | ✅ | ✅ | ✅ | ❌ | ✅ |
| Bidirectional diagram-as-code | ✅ | ❌ | ❌ | ✅ | ❌ |
| AI generation (10 providers + Ollama) | ✅ | ❌ | ❌ | ❌ | Limited |
| AI generation (11 providers + Ollama) | ✅ | ❌ | ❌ | ❌ | Limited |
| Mermaid import (8 types) | ✅ | ❌ | ⚠️ | ✅ | ❌ |
| Auto-icon assignment (1,600+) | ✅ | ❌ | ❌ | ❌ | ❌ |
| AWS / Azure / GCP / CNCF icons | ✅ | ❌ | ✅ | Partial | ✅ |
Expand Down Expand Up @@ -169,7 +169,7 @@ Describe your system in plain English. AI generates a diagram on the canvas with
| "AWS Lambda → SQS → DynamoDB" | 3 nodes with AWS icons |
| "React frontend → Express → MongoDB → S3" | 4 nodes across developer + AWS catalogs |

10 providers supported: Google Gemini, OpenAI, Anthropic Claude, Groq, Mistral, NVIDIA NIM, Cerebras, OpenRouter, **Ollama (fully local)**, or any custom OpenAI-compatible endpoint. Bad DSL from any provider is now auto-repaired — the model sees its own broken output and the parser error, then returns corrected DSL in a single follow-up turn.
11 providers supported: Google Gemini, OpenAI, Anthropic Claude, Groq, Mistral, NVIDIA NIM, Cerebras, OpenRouter, Requesty, **Ollama (fully local)**, or any custom OpenAI-compatible endpoint. Bad DSL from any provider is now auto-repaired — the model sees its own broken output and the parser error, then returns corrected DSL in a single follow-up turn.

---

Expand All @@ -188,7 +188,7 @@ That means the app does not create a fake default flow just to get you onto the

Flowpilot sits directly in the editor. Describe a system, paste source code, upload a screenshot, or ask it to refine what's already on the canvas. Your API key is stored in your browser and sent directly to the provider — OpenFlowKit's servers never see it.

**10 providers. Bring your own key. Switch any time. One runs entirely on your laptop.**
**11 providers. Bring your own key. Switch any time. One runs entirely on your laptop.**

| Provider | Default model | Why use it |
| ------------------- | ------------------------------------------ | ----------------------------------------------- |
Expand All @@ -201,6 +201,7 @@ Flowpilot sits directly in the editor. Describe a system, paste source code, upl
| NVIDIA NIM | `meta/llama-4-maverick-17b-128e-instruct` | Enterprise GPU inference |
| Cerebras | `gpt-oss-120b` | Ultra-fast on WSE-3 silicon |
| OpenRouter | `google/gemini-2.5-pro` | Access 300+ models through one key |
| Requesty | `openai/gpt-4o-mini` | 700+ models, managed failover policies |
| **Custom endpoint** | Any model | LM Studio, vLLM, or any OpenAI-compatible API |

No proxy. No middleman. Direct browser-to-provider requests.
Expand Down
2 changes: 1 addition & 1 deletion _headers
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.requesty.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';

/assets/*
Cache-Control: public, max-age=31536000, immutable
1 change: 1 addition & 0 deletions docs-site/src/content/docs/ai-generation.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ The app supports multiple BYOK providers, including:
- Cerebras
- Mistral
- OpenRouter
- Requesty
- Custom OpenAI-compatible endpoint

This matters because you are not locked to one hosted AI vendor or one billing model. Ollama can run locally with no API key when its daemon and model are available.
Expand Down
1 change: 1 addition & 0 deletions docs-site/src/content/docs/tr/ai-generation.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Uygulama birden çok BYOK sağlayıcıyı destekler:
- Cerebras
- Mistral
- OpenRouter
- Requesty
- özel OpenAI-uyumlu uç nokta

## AI ne zaman doğru araçtır?
Expand Down
8 changes: 4 additions & 4 deletions nginx/nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ server {
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.requesty.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';" always;

location /assets/ {
access_log off;
Expand All @@ -34,7 +34,7 @@ server {
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.requesty.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';" always;
try_files $uri =404;
}

Expand All @@ -44,7 +44,7 @@ server {
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.requesty.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';" always;
}

location / {
Expand All @@ -53,7 +53,7 @@ server {
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' https://*.openai.com https://*.anthropic.com https://*.googleapis.com https://api.groq.com https://*.mistral.ai https://*.cerebras.ai https://openrouter.ai https://*.requesty.ai https://*.posthog.com wss://*.openflowkit.com wss://signaling.yjs.dev; img-src 'self' data: blob: https:; font-src 'self' data:; worker-src 'self' blob:; frame-ancestors 'none';" always;
try_files $uri $uri/ /index.html;
}
}
32 changes: 32 additions & 0 deletions public/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,10 @@
"hint": "Le Chat · Codestral · European AI leader",
"keySetupNote": "Free tier with generous limits — no credit card needed"
},
"requesty": {
"hint": "LLM gateway · 700+ models · One key",
"keySetupNote": "Pay as you go · Add credits in the Requesty dashboard"
},
"custom": {
"hint": "Any OpenAI-compatible endpoint"
}
Expand Down Expand Up @@ -1212,6 +1216,34 @@
"badge": "Vision"
}
},
"requesty": {
"openai/gpt-4o-mini": {
"label": "GPT-4o mini",
"hint": "Fast · Cost-efficient",
"category": "Speed",
"badge": "Default"
},
"gpt-5.4-mini": {
"label": "GPT-5.4 mini",
"hint": "Managed policy · Multi-provider failover",
"category": "Speed"
},
"claude-sonnet-4-6": {
"label": "Claude Sonnet 4.6",
"hint": "Managed policy · Best coding",
"category": "Flagship"
},
"gemini-3.5-flash": {
"label": "Gemini 3.5 Flash",
"hint": "Managed policy · Fast multimodal",
"category": "Speed"
},
"deepseek-v4-flash": {
"label": "DeepSeek V4 Flash",
"hint": "Managed policy · Low cost",
"category": "Speed"
}
},
"custom": {
"custom": {
"label": "Custom Model",
Expand Down
1 change: 1 addition & 0 deletions public/logos/requesty.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export function AdvancedEndpointSection({
{t('settingsModal.ai.resetEndpoint', { defaultValue: 'Reset to default' })}
</button>
</div>
{(currentProvider === 'custom' || currentProvider === 'openrouter' || !!customBaseUrl) && (
{(currentProvider === 'custom' || currentProvider === 'openrouter' || currentProvider === 'requesty' || !!customBaseUrl) && (
<p className="text-[11px] text-[var(--brand-secondary)]">
<Trans i18nKey="settingsModal.ai.customEndpointMustSupport">
Must support <code className="rounded-[var(--radius-xs)] bg-[var(--brand-background)] px-1 text-[10px]">POST /chat/completions</code> (OpenAI format)
Expand Down
22 changes: 22 additions & 0 deletions src/config/aiProviders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const PROVIDER_BASE_URLS: Record<Exclude<AIProvider, 'gemini' | 'claude'
cerebras: 'https://api.cerebras.ai/v1',
mistral: 'https://api.mistral.ai/v1',
openrouter: 'https://openrouter.ai/api/v1',
requesty: 'https://router.requesty.ai/v1',
// Ollama exposes an OpenAI-compatible endpoint at /v1 on the local daemon.
ollama: 'http://localhost:11434/v1',
};
Expand All @@ -20,6 +21,7 @@ export const DEFAULT_MODELS: Record<AIProvider, string> = {
cerebras: 'gpt-oss-120b',
mistral: 'mistral-large-latest',
openrouter: 'google/gemini-2.5-pro',
requesty: 'openai/gpt-4o-mini',
ollama: 'llama3.2',
custom: 'gpt-4o',
};
Expand Down Expand Up @@ -130,6 +132,17 @@ export const PROVIDERS: ProviderMeta[] = [
consoleName: 'OpenRouter Dashboard',
defaultModel: getDefaultModel('openrouter'),
},
{
id: 'requesty',
name: 'Requesty',
icon: '⇄',
color: '#1677FF',
logoPath: '/logos/requesty.svg',
keyPlaceholder: 'rqsty-...',
keyLink: 'https://app.requesty.ai/api-keys',
consoleName: 'Requesty Dashboard',
defaultModel: getDefaultModel('requesty'),
},
{
id: 'ollama',
name: 'Ollama (local)',
Expand Down Expand Up @@ -210,6 +223,13 @@ export const PROVIDER_MODELS: Record<AIProvider, { id: string; translateKey: str
{ id: 'anthropic/claude-sonnet-4', translateKey: 'anthropic/claude-sonnet-4' },
{ id: 'deepseek/deepseek-chat-v3.1', translateKey: 'deepseek/deepseek-chat-v3.1' },
],
requesty: [
{ id: 'openai/gpt-4o-mini', translateKey: 'openai/gpt-4o-mini' },
{ id: 'gpt-5.4-mini', translateKey: 'gpt-5.4-mini' },
{ id: 'claude-sonnet-4-6', translateKey: 'claude-sonnet-4-6' },
{ id: 'gemini-3.5-flash', translateKey: 'gemini-3.5-flash' },
{ id: 'deepseek-v4-flash', translateKey: 'deepseek-v4-flash' },
],
ollama: [
{ id: 'llama3.2', translateKey: 'llama3.2' },
{ id: 'llama3.1', translateKey: 'llama3.1' },
Expand All @@ -236,6 +256,7 @@ export const DEFAULT_BASE_URLS: Record<Exclude<AIProvider, 'gemini' | 'claude'>,
cerebras: PROVIDER_BASE_URLS.cerebras,
mistral: PROVIDER_BASE_URLS.mistral,
openrouter: PROVIDER_BASE_URLS.openrouter,
requesty: PROVIDER_BASE_URLS.requesty,
ollama: PROVIDER_BASE_URLS.ollama,
custom: 'https://api.example.com/v1',
};
Expand All @@ -245,6 +266,7 @@ export type ProviderRisk = 'browser_friendly' | 'mixed' | 'proxy_likely';
export const PROVIDER_RISK: Record<AIProvider, ProviderRisk> = {
gemini: 'browser_friendly',
openrouter: 'browser_friendly',
requesty: 'browser_friendly',
openai: 'mixed',
claude: 'mixed',
groq: 'proxy_likely',
Expand Down
32 changes: 32 additions & 0 deletions src/i18n/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,10 @@
"hint": "Le Chat · Codestral · European AI leader",
"keySetupNote": "Free tier with generous limits — no credit card needed"
},
"requesty": {
"hint": "LLM gateway · 700+ models · One key",
"keySetupNote": "Pay as you go · Add credits in the Requesty dashboard"
},
"custom": {
"hint": "Any OpenAI-compatible endpoint"
}
Expand Down Expand Up @@ -1212,6 +1216,34 @@
"badge": "Vision"
}
},
"requesty": {
"openai/gpt-4o-mini": {
"label": "GPT-4o mini",
"hint": "Fast · Cost-efficient",
"category": "Speed",
"badge": "Default"
},
"gpt-5.4-mini": {
"label": "GPT-5.4 mini",
"hint": "Managed policy · Multi-provider failover",
"category": "Speed"
},
"claude-sonnet-4-6": {
"label": "Claude Sonnet 4.6",
"hint": "Managed policy · Best coding",
"category": "Flagship"
},
"gemini-3.5-flash": {
"label": "Gemini 3.5 Flash",
"hint": "Managed policy · Fast multimodal",
"category": "Speed"
},
"deepseek-v4-flash": {
"label": "DeepSeek V4 Flash",
"hint": "Managed policy · Low cost",
"category": "Speed"
}
},
"custom": {
"custom": {
"label": "Custom Model",
Expand Down
Loading