@d34dman/flowdrop 0.0.19 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +168 -344
  2. package/dist/components/App.svelte +229 -282
  3. package/dist/components/ConfigForm.svelte +0 -3
  4. package/dist/components/ConfigSidebar.svelte +5 -23
  5. package/dist/components/Navbar.svelte +2 -1
  6. package/dist/components/NodeStatusOverlay.svelte +1 -0
  7. package/dist/components/NodeStatusOverlay.svelte.d.ts +1 -0
  8. package/dist/components/WorkflowEditor.svelte +33 -25
  9. package/dist/components/layouts/MainLayout.svelte +513 -0
  10. package/dist/components/layouts/MainLayout.svelte.d.ts +50 -0
  11. package/dist/components/{GatewayNode.svelte → nodes/GatewayNode.svelte} +3 -3
  12. package/dist/components/{GatewayNode.svelte.d.ts → nodes/GatewayNode.svelte.d.ts} +1 -1
  13. package/dist/components/{NotesNode.svelte → nodes/NotesNode.svelte} +2 -2
  14. package/dist/components/{NotesNode.svelte.d.ts → nodes/NotesNode.svelte.d.ts} +1 -1
  15. package/dist/components/{SimpleNode.svelte → nodes/SimpleNode.svelte} +2 -2
  16. package/dist/components/{SimpleNode.svelte.d.ts → nodes/SimpleNode.svelte.d.ts} +1 -1
  17. package/dist/components/{SquareNode.svelte → nodes/SquareNode.svelte} +2 -2
  18. package/dist/components/{SquareNode.svelte.d.ts → nodes/SquareNode.svelte.d.ts} +1 -1
  19. package/dist/components/{TerminalNode.svelte → nodes/TerminalNode.svelte} +2 -2
  20. package/dist/components/{TerminalNode.svelte.d.ts → nodes/TerminalNode.svelte.d.ts} +1 -1
  21. package/dist/components/{ToolNode.svelte → nodes/ToolNode.svelte} +2 -2
  22. package/dist/components/{ToolNode.svelte.d.ts → nodes/ToolNode.svelte.d.ts} +1 -1
  23. package/dist/components/{WorkflowNode.svelte → nodes/WorkflowNode.svelte} +3 -3
  24. package/dist/components/{WorkflowNode.svelte.d.ts → nodes/WorkflowNode.svelte.d.ts} +1 -1
  25. package/dist/index.d.ts +6 -6
  26. package/dist/index.js +6 -6
  27. package/dist/registry/builtinNodes.js +7 -7
  28. package/dist/styles/base.css +15 -1
  29. package/package.json +7 -2
package/README.md CHANGED
@@ -1,429 +1,253 @@
1
- # FlowDrop
1
+ <p align="center">
2
+ <img src="static/logo.svg" alt="FlowDrop" width="120" />
3
+ </p>
2
4
 
3
- A visual workflow editor component library built with Svelte 5 and @xyflow/svelte. Create complex workflows with drag-and-drop functionality, node-based editing, and configurable API integration.
5
+ <h1 align="center">FlowDrop</h1>
4
6
 
5
- ## 🚀 Features
7
+ <p align="center">
8
+ <img src="https://img.shields.io/github/actions/workflow/status/d34dman/flowdrop/docker-publish.yml?style=flat-square&label=Build" alt="GitHub pages build status" />
9
+ <a href="https://www.npmjs.com/package/@d34dman/flowdrop"><img src="https://img.shields.io/npm/v/@d34dman/flowdrop?style=flat-square" alt="npm" /></a>
10
+ <img src="https://img.shields.io/npm/unpacked-size/%40d34dman%2Fflowdrop?style=flat-square" alt="NPM Unpacked Size" />
11
+ <img src="https://img.shields.io/npm/types/@d34dman/flowdrop?style=flat-square" alt="npm type definitions" />
12
+ <a href="http://npmjs.com/package/@d34dman/flowdrop"><img src="https://img.shields.io/npm/dt/@d34dman/flowdrop.svg?maxAge=2592000&style=flat-square" alt="npm downloads" /></a>
13
+ </p>
6
14
 
7
- - **Visual Workflow Editor**: Drag-and-drop interface for building node-based workflows
8
- - **Svelte 5 Components**: Modern, reactive components with runes
9
- - **Configurable API Client**: Flexible endpoint configuration for backend integration
10
- - **Runtime Configuration**: Build once, deploy anywhere with environment variables
11
- - **Node System**: Extensible node types with customizable configuration
12
- - **Real-time Updates**: Live workflow state management with stores
13
- - **Framework Agnostic**: Can be integrated into any web application
14
- - **TypeScript Support**: Full type definitions included
15
- - **Docker Ready**: Production-ready Dockerfile and Docker Compose configuration
15
+ <p align="center">
16
+ <strong>Build beautiful workflow editors in minutes, not months.</strong>
17
+ </p>
16
18
 
17
- ### Enterprise Features (v0.0.16+)
19
+ <p align="center">
20
+ An awesome workflow editor built with Svelte 5 and @xyflow/svelte.<br/>
21
+ You own the backend. You own the data. You own the orchestration.
22
+ </p>
18
23
 
19
- - **Pluggable Authentication**: AuthProvider interface for OAuth, JWT, SSO integration
20
- - **Workflow Lifecycle Events**: Hooks for save, load, change, and unmount events
21
- - **Dirty State Tracking**: Monitor unsaved changes with reactive stores
22
- - **Draft Auto-Save**: Automatic localStorage drafts with configurable intervals
23
- - **Feature Flags**: Customize behavior for security and UX requirements
24
+ <p align="center">
25
+ <a href="#quickstart">Quickstart</a>
26
+ <a href="#features">Features</a>
27
+ <a href="#integration">Integration</a>
28
+ <a href="#documentation">Docs</a>
29
+ </p>
24
30
 
25
- ## 📦 Installation
31
+ <p align="center">
32
+ <img src="static/FlowDrop-Screenshot.jpg" alt="FlowDrop Screenshot" width="800" />
33
+ </p>
34
+ <p align="center">
35
+ <em>Build AI-powered workflows with drag-and-drop simplicity. Connect nodes, configure inputs/outputs, and visualize your entire pipeline.</em>
36
+ </p>
26
37
 
27
- ```bash
28
- npm install @d34dman/flowdrop
29
- ```
38
+ ## Why FlowDrop?
30
39
 
31
- ## 📁 Project Structure
40
+ Most workflow tools are SaaS platforms that lock you in. Your data lives on their servers. Your execution logic runs in their cloud. You pay per workflow, per user, per run.
32
41
 
33
- ```
34
- @d34dman/flowdrop/
35
- ├── dist/ # Built library files
36
- │ ├── components/ # Svelte components
37
- │ ├── types/ # TypeScript definitions
38
- │ ├── services/ # API and state management
39
- │ ├── utils/ # Utility functions
40
- │ └── styles/ # CSS styles
41
- ├── src/ # Source code
42
- │ └── lib/ # Library source
43
- │ ├── components/ # Svelte components
44
- │ ├── services/ # Services and APIs
45
- │ ├── stores/ # State management
46
- │ └── types/ # Type definitions
47
- └── api/ # API documentation
48
- ```
42
+ **FlowDrop is different.**
49
43
 
50
- ## 🎯 Usage
44
+ FlowDrop is a pure visual editor. You implement the backend. You control the orchestration. Your workflows run on your infrastructure, with your security policies, at your scale.
51
45
 
52
- ### Basic Import
46
+ No vendor lock-in. No data leaving your walls. No surprise bills.
53
47
 
54
- ```javascript
55
- import { WorkflowEditor } from '@d34dman/flowdrop';
56
- import '@d34dman/flowdrop/styles/base.css';
48
+ ```bash
49
+ npm install @d34dman/flowdrop
57
50
  ```
58
51
 
59
- ### Using the WorkflowEditor Component
52
+ You get a production-ready workflow UI. You keep full control of everything else.
53
+
54
+
55
+ ## Quickstart
60
56
 
61
57
  ```svelte
62
58
  <script lang="ts">
63
- import { WorkflowEditor } from '@d34dman/flowdrop';
64
- import type { NodeMetadata, Workflow } from '@d34dman/flowdrop';
65
-
66
- let nodes: NodeMetadata[] = [
67
- {
68
- id: 'text_input',
69
- name: 'Text Input',
70
- category: 'input_output',
71
- description: 'User input field',
72
- inputs: [],
73
- outputs: [{ id: 'value', name: 'Value', type: 'output', dataType: 'string' }]
74
- }
75
- ];
76
-
77
- let workflow: Workflow = {
78
- id: 'workflow_1',
79
- name: 'My Workflow',
80
- nodes: [],
81
- edges: []
82
- };
59
+ import { WorkflowEditor } from "@d34dman/flowdrop";
60
+ import "@d34dman/flowdrop/styles/base.css";
83
61
  </script>
84
62
 
85
- <WorkflowEditor {nodes} />
63
+ <WorkflowEditor />
86
64
  ```
87
65
 
88
- ### Integration Methods
66
+ **5 lines. One fully-functional workflow editor.**
89
67
 
90
- #### 1. As a Svelte Component (Recommended)
68
+
69
+ ## Features
70
+
71
+ | | |
72
+ | --------------------------- | ------------------------------------------------------------------------- |
73
+ | 🎨 **Visual Editor Only** | Pure UI component. No hidden backend, no external dependencies |
74
+ | 🔐 **You Own Everything** | Your data, your servers, your orchestration logic, your security policies |
75
+ | 🔌 **Backend Agnostic** | Connect to any API: Drupal, Laravel, Express, FastAPI, or your own |
76
+ | 🧩 **7 Built-in Node Types** | From simple icons to complex gateway logic |
77
+ | 🎭 **Framework Flexible** | Use as Svelte component or mount into React, Vue, Angular, or vanilla JS |
78
+ | 🐳 **Deploy Anywhere** | Runtime config means build once, deploy everywhere |
79
+
80
+
81
+ ## Node Types
82
+
83
+ FlowDrop ships with 7 beautifully designed node types:
84
+
85
+ | Type | Purpose |
86
+ | ---------- | --------------------------------------- |
87
+ | `default` | Full-featured nodes with inputs/outputs |
88
+ | `simple` | Compact, space-efficient layout |
89
+ | `square` | Icon-only minimal design |
90
+ | `tool` | AI agent tool nodes |
91
+ | `gateway` | Conditional branching logic |
92
+ | `terminal` | Start/end workflow points |
93
+ | `note` | Markdown documentation blocks |
94
+
95
+ <p align="center">
96
+ <img src="static/Node-Types.jpg" alt="FlowDrop Node Types" width="800" />
97
+ </p>
98
+ <p align="center">
99
+ <em>From simple triggers to complex branching logic, each node type is designed for specific workflow patterns.</em>
100
+ </p>
101
+
102
+ ## Integration
103
+
104
+ ### Svelte (Native)
91
105
 
92
106
  ```svelte
93
107
  <script>
94
- import { WorkflowEditor, NodeSidebar } from '@d34dman/flowdrop';
108
+ import { WorkflowEditor, NodeSidebar } from "@d34dman/flowdrop";
95
109
  </script>
96
110
 
97
- <div class="editor-container">
98
- <NodeSidebar {nodes} />
99
- <WorkflowEditor {nodes} />
111
+ <div class="flex h-screen">
112
+ <NodeSidebar {nodes} />
113
+ <WorkflowEditor {nodes} />
100
114
  </div>
101
115
  ```
102
116
 
103
- #### 2. Using Mount Functions (Vanilla JS/Other Frameworks)
117
+ ### Vanilla JS / React / Vue / Angular
104
118
 
105
119
  ```javascript
106
- import { mountWorkflowEditor } from '@d34dman/flowdrop';
107
-
108
- const container = document.getElementById('workflow-container');
109
- const editor = mountWorkflowEditor(container, {
110
- nodes: availableNodes,
111
- endpointConfig: {
112
- baseUrl: '/api/flowdrop',
113
- endpoints: {
114
- workflows: {
115
- list: '/workflows',
116
- get: '/workflows/{id}',
117
- create: '/workflows',
118
- update: '/workflows/{id}'
119
- }
120
- }
121
- }
120
+ import { mountFlowDropApp, createEndpointConfig } from "@d34dman/flowdrop";
121
+
122
+ const app = await mountFlowDropApp(document.getElementById("editor"), {
123
+ workflow: myWorkflow,
124
+ endpointConfig: createEndpointConfig("/api/flowdrop"),
125
+ eventHandlers: {
126
+ onDirtyStateChange: (isDirty) => console.log("Unsaved changes:", isDirty),
127
+ onAfterSave: (workflow) => console.log("Saved!", workflow)
128
+ }
122
129
  });
123
130
 
124
- // Cleanup
125
- editor.destroy();
131
+ // Full control over the editor
132
+ app.save();
133
+ app.getWorkflow();
134
+ app.destroy();
126
135
  ```
127
136
 
128
- #### 3. Enterprise Integration (v0.0.16+)
137
+ ### Enterprise Integration
129
138
 
130
139
  ```javascript
131
- import { mountFlowDropApp, createEndpointConfig, CallbackAuthProvider } from '@d34dman/flowdrop';
140
+ import { mountFlowDropApp, CallbackAuthProvider } from "@d34dman/flowdrop";
132
141
 
133
142
  const app = await mountFlowDropApp(container, {
134
- workflow: myWorkflow,
135
- endpointConfig: createEndpointConfig('/api/flowdrop'),
136
-
137
- // Dynamic authentication with token refresh
138
- authProvider: new CallbackAuthProvider({
139
- getToken: () => authService.getAccessToken(),
140
- onUnauthorized: () => authService.refreshToken()
141
- }),
142
-
143
- // Workflow lifecycle hooks
144
- eventHandlers: {
145
- onDirtyStateChange: (isDirty) => updateSaveButton(isDirty),
146
- onAfterSave: (workflow) => showSuccess('Saved!'),
147
- onBeforeUnmount: (workflow, isDirty) => {
148
- if (isDirty) saveDraft(workflow);
149
- }
150
- },
151
-
152
- // Feature configuration
153
- features: {
154
- autoSaveDraft: true,
155
- autoSaveDraftInterval: 30000,
156
- showToasts: true
157
- }
143
+ // Dynamic token refresh
144
+ authProvider: new CallbackAuthProvider({
145
+ getToken: () => authService.getAccessToken(),
146
+ onUnauthorized: () => authService.refreshToken()
147
+ }),
148
+
149
+ // Lifecycle hooks
150
+ eventHandlers: {
151
+ onBeforeUnmount: (workflow, isDirty) => {
152
+ if (isDirty) saveDraft(workflow);
153
+ }
154
+ },
155
+
156
+ // Auto-save, toasts, and more
157
+ features: {
158
+ autoSaveDraft: true,
159
+ autoSaveDraftInterval: 30000
160
+ }
158
161
  });
159
-
160
- // Access instance methods
161
- if (app.isDirty()) {
162
- await app.save();
163
- }
164
-
165
- // Get current workflow data
166
- const workflow = app.getWorkflow();
167
-
168
- // Cleanup
169
- app.destroy();
170
- ```
171
-
172
- #### 3. Integration with Backend Frameworks
173
-
174
- ##### Drupal Example
175
-
176
- ```javascript
177
- Drupal.behaviors.flowdropEditor = {
178
- attach: function (context, settings) {
179
- const container = context.querySelector('.flowdrop-container');
180
- if (container && window.FlowDrop) {
181
- window.FlowDrop.mountWorkflowEditor(container, {
182
- endpointConfig: settings.flowdrop.endpointConfig,
183
- nodes: settings.flowdrop.nodes
184
- });
185
- }
186
- }
187
- };
188
162
  ```
189
163
 
190
- ## 📚 Core Components
191
-
192
- ### WorkflowEditor
193
-
194
- Main editor component for creating and editing workflows.
195
-
196
- **Props:**
197
-
198
- - `nodes`: Array of available node types
199
- - `endpointConfig`: API endpoint configuration
200
- - `height`: Editor height (default: "100vh")
201
- - `width`: Editor width (default: "100%")
202
- - `lockWorkflow`: Disable editing
203
- - `readOnly`: Read-only mode
204
-
205
- ### NodeSidebar
206
-
207
- Sidebar displaying available node types.
208
-
209
- **Props:**
210
-
211
- - `nodes`: Array of node types to display
212
-
213
- ### ConfigSidebar
214
-
215
- Configuration panel for selected nodes.
216
164
 
217
- **Props:**
165
+ ## API Configuration
218
166
 
219
- - `isOpen`: Sidebar visibility
220
- - `configSchema`: JSON schema for configuration
221
- - `configValues`: Current configuration values
222
- - `onSave`: Save handler
223
- - `onClose`: Close handler
224
-
225
- ## 🔧 API Configuration
226
-
227
- Configure the API client to connect to your backend:
167
+ Connect to any backend in seconds:
228
168
 
229
169
  ```typescript
230
- import { createEndpointConfig } from '@d34dman/flowdrop';
170
+ import { createEndpointConfig } from "@d34dman/flowdrop";
231
171
 
232
172
  const config = createEndpointConfig({
233
- baseUrl: 'https://api.example.com',
234
- endpoints: {
235
- nodes: {
236
- list: '/nodes',
237
- get: '/nodes/{id}'
238
- },
239
- workflows: {
240
- list: '/workflows',
241
- get: '/workflows/{id}',
242
- create: '/workflows',
243
- update: '/workflows/{id}',
244
- delete: '/workflows/{id}',
245
- execute: '/workflows/{id}/execute'
246
- }
247
- },
248
- timeout: 30000,
249
- auth: {
250
- type: 'bearer',
251
- token: 'your-token'
252
- }
173
+ baseUrl: "https://api.example.com",
174
+ endpoints: {
175
+ nodes: { list: "/nodes", get: "/nodes/{id}" },
176
+ workflows: {
177
+ list: "/workflows",
178
+ get: "/workflows/{id}",
179
+ create: "/workflows",
180
+ update: "/workflows/{id}",
181
+ execute: "/workflows/{id}/execute"
182
+ }
183
+ },
184
+ auth: { type: "bearer", token: "your-token" }
253
185
  });
254
186
  ```
255
187
 
256
- ## 🎨 Customization
257
188
 
258
- ### Styling
189
+ ## Customization
259
190
 
260
- Override CSS custom properties:
191
+ Make it yours with CSS custom properties:
261
192
 
262
193
  ```css
263
194
  :root {
264
- --flowdrop-background-color: #f9fafb;
265
- --flowdrop-primary-color: #3b82f6;
266
- --flowdrop-border-color: #e5e7eb;
267
- --flowdrop-text-color: #1f2937;
195
+ --flowdrop-background-color: #0a0a0a;
196
+ --flowdrop-primary-color: #6366f1;
197
+ --flowdrop-border-color: #27272a;
198
+ --flowdrop-text-color: #fafafa;
268
199
  }
269
200
  ```
270
201
 
271
- ### Node Types
272
-
273
- FlowDrop includes 7 built-in visual node types that control how nodes are rendered:
274
-
275
- | Type | Description | Use Case |
276
- | ---------- | ------------------------------------------------------- | ------------------------ |
277
- | `default` | Full-featured workflow node with inputs/outputs display | Standard nodes |
278
- | `simple` | Compact layout with header, icon, and description | Space-efficient nodes |
279
- | `square` | Minimal square node showing only an icon | Icon-only representation |
280
- | `tool` | Specialized node for agent tools with tool metadata | AI agent tools |
281
- | `gateway` | Branching control flow with multiple output branches | Conditional logic |
282
- | `terminal` | Circular node for workflow start/end/exit points | Workflow boundaries |
283
- | `note` | Documentation note with markdown support | Comments/documentation |
284
-
285
- #### Terminal Nodes
286
-
287
- Terminal nodes are special circular nodes for workflow boundaries:
288
-
289
- ```typescript
290
- // Start node - output only
291
- const startNode: NodeMetadata = {
292
- id: 'workflow-start',
293
- name: 'Start',
294
- type: 'terminal',
295
- tags: ['start'],
296
- inputs: [],
297
- outputs: [{ id: 'trigger', name: 'Go', type: 'output', dataType: 'trigger' }]
298
- };
299
-
300
- // End node - input only
301
- const endNode: NodeMetadata = {
302
- id: 'workflow-end',
303
- name: 'End',
304
- type: 'terminal',
305
- tags: ['end'],
306
- inputs: [{ id: 'done', name: 'Done', type: 'input', dataType: 'trigger' }],
307
- outputs: []
308
- };
309
- ```
310
-
311
202
 
312
- ## 🔌 Backend Integration
203
+ ## Deploy
313
204
 
314
- FlowDrop is backend-agnostic. Implement the API endpoints expected by the client:
315
-
316
- ### Required Endpoints
317
-
318
- - `GET /api/nodes` - List available node types
319
- - `GET /api/workflows` - List workflows
320
- - `GET /api/workflows/{id}` - Get workflow
321
- - `POST /api/workflows` - Create workflow
322
- - `PUT /api/workflows/{id}` - Update workflow
323
- - `DELETE /api/workflows/{id}` - Delete workflow
324
- - `POST /api/workflows/{id}/execute` - Execute workflow
325
-
326
- See `API.md` for detailed endpoint specifications.
327
-
328
- ## 🧪 Testing
205
+ ### Docker (Recommended)
329
206
 
330
207
  ```bash
331
- # Unit tests
332
- npm run test:unit
333
-
334
- # E2E tests
335
- npm run test:e2e
336
-
337
- # All tests
338
- npm test
208
+ cp env.example .env
209
+ docker-compose up -d
339
210
  ```
340
211
 
341
- ## 🛠️ Development
212
+ ### Node.js
342
213
 
343
214
  ```bash
344
- # Install dependencies
345
- npm install
346
-
347
- # Development server
348
- npm run dev
349
-
350
- # Build library
351
215
  npm run build
352
-
353
- # Build for production
354
- npm run build:production
355
-
356
- # Linting
357
- npm run lint
358
-
359
- # Format code
360
- npm run format
216
+ FLOWDROP_API_BASE_URL=http://your-backend/api node build
361
217
  ```
362
218
 
363
- ## 📖 Documentation
364
-
365
- - **API.md** - REST API specification
366
- - **CHANGELOG.md** - Version history
367
-
368
- ## 🤝 Contributing
219
+ Runtime configuration means you build once and deploy to staging, production, or anywhere else with just environment variables.
369
220
 
370
- Not accepting contributions until the library stabilizes. Stay tuned.
371
221
 
372
- ## 📄 License
373
222
 
374
- MIT
223
+ ## Documentation
375
224
 
376
- ## 🆘 Support
225
+ | Resource | Description |
226
+ | ---------------------------------- | ------------------------ |
227
+ | [API.md](./API.md) | REST API specification |
228
+ | [DOCKER.md](./DOCKER.md) | Docker deployment guide |
229
+ | [QUICK_START.md](./QUICK_START.md) | Get running in 5 minutes |
230
+ | [CHANGELOG.md](./CHANGELOG.md) | Version history |
377
231
 
378
- - Check the API documentation in `API.md`
379
- - Create an issue in the project repository
380
- - Review the examples in `src/lib/examples/`
381
-
382
- ## 🚢 Deployment
383
-
384
- FlowDrop uses **runtime configuration** instead of build-time environment variables, allowing you to build once and deploy to multiple environments.
385
-
386
- ### Quick Start with Docker
232
+ ## Development
387
233
 
388
234
  ```bash
389
- # Copy environment file
390
- cp env.example .env
391
-
392
- # Edit .env with your configuration
393
- # Set FLOWDROP_API_BASE_URL to your backend API URL
394
-
395
- # Start with Docker Compose
396
- docker-compose up -d
235
+ npm install # Install dependencies
236
+ npm run dev # Start dev server
237
+ npm run build # Build library
238
+ npm test # Run all tests
397
239
  ```
398
240
 
399
- ### Environment Variables
400
-
401
- **Production (Runtime):**
402
-
403
- - `FLOWDROP_API_BASE_URL` - Backend API URL
404
- - `FLOWDROP_THEME` - UI theme (light/dark/auto)
405
- - `FLOWDROP_TIMEOUT` - Request timeout in milliseconds
406
- - `FLOWDROP_AUTH_TYPE` - Authentication type (none/bearer/api_key/custom)
407
- - `FLOWDROP_AUTH_TOKEN` - Authentication token
408
-
409
- ### Build for Production
410
241
 
411
- ```bash
412
- # Install dependencies
413
- npm ci
414
-
415
- # Build the application
416
- npm run build
417
-
418
- # Set environment variables and start
419
- export FLOWDROP_API_BASE_URL=http://your-backend:8080/api/flowdrop
420
- node build
421
- ```
242
+ ## Contributing
422
243
 
423
- For detailed deployment instructions, see:
244
+ FlowDrop is stabilizing. Contributions will open soon. Star the repo to stay updated.
424
245
 
425
- - [DOCKER.md](./DOCKER.md) - Docker quick start
426
246
 
427
- ---
247
+ <p align="center">
248
+ <strong>FlowDrop</strong> - The visual workflow editor you own completely
249
+ </p>
428
250
 
429
- **FlowDrop** - Visual workflow editing for modern web applications
251
+ <p align="center">
252
+ Built with ❤️ Svelte 5 and @xyflow/svelte
253
+ </p>