Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
135 commits
Select commit Hold shift + click to select a range
b850e60
remove old code
galaddirie Mar 5, 2026
cff0918
remove executions layer
galaddirie Mar 10, 2026
d0c9fad
remove migrations
galaddirie Mar 10, 2026
5af50a7
remove workflow contract
galaddirie Mar 10, 2026
f1182f5
Remove workflows context and related modules
galaddirie Mar 12, 2026
b6858e9
Rename workspaces to projects
galaddirie Mar 12, 2026
06a8a30
Rename Sprites domain to Workspaces
galaddirie Mar 12, 2026
24c9d4c
design plan
galaddirie Mar 12, 2026
d1790f5
Update durable-workflows-design.md
galaddirie Mar 12, 2026
862da1a
Update durable-workflows-design.md
galaddirie Mar 12, 2026
29302b1
Rename Platform.* to Fizz.Workflows in docs
galaddirie Mar 12, 2026
c2efb74
Update durable-workflows-design.md
galaddirie Mar 12, 2026
8fa90c7
update docs
galaddirie Mar 12, 2026
3400d19
Create workflow-defentition-design.md
galaddirie Mar 12, 2026
be739ed
Update workflow-defentition-design.md
galaddirie Mar 12, 2026
d1d5b8a
Update .gitignore
galaddirie Mar 12, 2026
8a63757
Add runtime doc ideas
galaddirie Mar 12, 2026
91ad6bc
remove expression
galaddirie Mar 12, 2026
54dadd5
Update workflow-defentition-design.md
galaddirie Mar 12, 2026
b42c29b
remove cache
galaddirie Mar 12, 2026
29e09bb
remove cache
galaddirie Mar 12, 2026
621e802
add expression design doc
galaddirie Mar 12, 2026
6e4527a
Update durable-workflows-design.md
galaddirie Mar 12, 2026
17eb4d6
remove runtime ideas folder
galaddirie Mar 12, 2026
f9693ed
Update TODO.md
galaddirie Mar 14, 2026
c22ff3c
Create 2026-03-12-compilation-expression-context-design.md
galaddirie Mar 14, 2026
e597d9f
Update durable-workflows-design.md
galaddirie Mar 17, 2026
5695fe5
Delete 2026-03-12-compilation-expression-context-design.md
galaddirie Mar 17, 2026
96d63cc
bump runic
galaddirie Mar 17, 2026
35ad979
Create steps-and-integrations-design.md
galaddirie Mar 17, 2026
e5a783a
update plans
galaddirie Mar 18, 2026
12950e4
chore
galaddirie Mar 18, 2026
26e81f1
specs
galaddirie Mar 18, 2026
ec6d4de
more specs
galaddirie Mar 18, 2026
0990838
more specs
galaddirie Mar 18, 2026
3d6ad1e
Update workflow specs
galaddirie Mar 18, 2026
a693583
more spec updates
galaddirie Mar 18, 2026
c4858ab
Create implementation-prompts.md
galaddirie Mar 18, 2026
a9334d3
Add workflows domain with definitions and versions
galaddirie Mar 18, 2026
3a03a79
Update implementation-prompts.md
galaddirie Mar 18, 2026
bf16255
update: litestream plans
galaddirie Mar 18, 2026
45375e9
Add workflows compiler and expression pipeline
galaddirie Mar 18, 2026
1e2eefe
temp runic vendor
galaddirie Mar 18, 2026
312fa0d
Improve join/aggregator compilation and add tests
galaddirie Mar 18, 2026
da7d3a6
Implicit aggregator join & fan-out tracking
galaddirie Mar 18, 2026
78c3ee5
Delete workflow-runic-gap-audit.md
galaddirie Mar 19, 2026
d0a7834
move
galaddirie Mar 19, 2026
84271b3
Add subnode support
galaddirie Mar 19, 2026
672e74b
Create triggers-design.md
galaddirie Mar 19, 2026
252bcfd
Add SQLite workflow store & Litestream manager
galaddirie Mar 19, 2026
e1fe7d2
Add workflow run runner, passivation, and schema
galaddirie Mar 19, 2026
2a2b177
Update triggers-design.md
galaddirie Mar 19, 2026
602e1eb
Add workflow triggers spec, decision, and docs
galaddirie Mar 19, 2026
b528f7e
update trigger design
galaddirie Mar 19, 2026
83edc1a
Add durable timers and signal routing
galaddirie Mar 20, 2026
8c4b77a
Add trigger subsystem, registration & workers
galaddirie Mar 20, 2026
48999c7
Add webhook triggers, schedule handling, and registry APIs
galaddirie Mar 20, 2026
3354e4b
Update passivation_sweeper.ex
galaddirie Mar 20, 2026
e59fb8d
Delete implementation-prompts.md
galaddirie Mar 20, 2026
79ee953
editor plans
galaddirie Mar 20, 2026
938dd10
editor specs
galaddirie Mar 20, 2026
1c380bd
Add DraftSession GenServer and operations
galaddirie Mar 20, 2026
523e698
Add workflow editor LiveView and tests
galaddirie Mar 20, 2026
6dbc11d
Add expression previews, editor resolvers & SSR toggle
galaddirie Mar 20, 2026
79f980e
Add step execution API and run broadcasts
galaddirie Mar 20, 2026
dd316d9
Add publish-time validation and UI
galaddirie Mar 20, 2026
1be9ff6
Use numeric workflow versions & publish preview
galaddirie Mar 20, 2026
675e447
setup db
galaddirie Mar 21, 2026
e9b90a9
Add Workflows list UI, routes; rename editor
galaddirie Mar 22, 2026
1fd4a9a
add issues
galaddirie Mar 22, 2026
ad4fd36
Add JSON field editor with validation
galaddirie Mar 22, 2026
c88941c
fixes
galaddirie Mar 23, 2026
8a47127
Refactor optimistic layout and presence handling
galaddirie Mar 23, 2026
3250a84
Refactor draft persistence and toolbar UI
galaddirie Mar 23, 2026
a591210
Server-drive undo/editor state and editor APIs
galaddirie Mar 23, 2026
42d2140
resolved issues
galaddirie Mar 23, 2026
b6e943d
Update 005-no-input-ui-for-manual-trigger.md
galaddirie Mar 23, 2026
8e6c779
Update TODO.md
galaddirie Mar 23, 2026
44dae3b
Update 005-no-input-ui-for-manual-trigger.md
galaddirie Mar 23, 2026
c592ba6
Update .gitignore
galaddirie Mar 23, 2026
85734dc
Support editor test runs and manual trigger data
galaddirie Mar 23, 2026
e6b8710
Update TODO.md
galaddirie Mar 23, 2026
e4eba9d
Preserve microsecond durations for runnables
galaddirie Mar 23, 2026
6dcd9e8
Update TODO.md
galaddirie Mar 23, 2026
87a8329
Update SVG files for Microsoft Outlook, SharePoint, and Notion with f…
galaddirie Mar 23, 2026
d53299b
todo
galaddirie Mar 23, 2026
97617ac
Add workflow revisions viewer and preview/apply
galaddirie Mar 23, 2026
9f7efe0
Update RevisionViewer.vue
galaddirie Mar 23, 2026
750eba3
Add step execution tracing and splitter output handling
galaddirie Mar 24, 2026
4d43928
cleanup
galaddirie Apr 4, 2026
03c8175
json input
galaddirie Apr 5, 2026
89796de
docs update
galaddirie Apr 5, 2026
d7407f1
add docs
galaddirie Apr 6, 2026
2104db2
Support cold passivation, S3 restore & durations
galaddirie Apr 7, 2026
f7e5a3b
Update useWorkflowEdges.ts
galaddirie Apr 7, 2026
d4b4822
Create app-builder-design.md
galaddirie Apr 7, 2026
806e76b
Update JsonField.vue
galaddirie Apr 7, 2026
a7425f8
Update run_show.ex
galaddirie Apr 7, 2026
bb11e75
Update worker.ex
galaddirie Apr 7, 2026
c8060f8
Make workflow passivation timeouts configurable
galaddirie Apr 7, 2026
0b18f3e
Add JsonFrame, unify data viewer & path helpers
galaddirie Apr 9, 2026
61a7356
Update TODO.md
galaddirie Apr 9, 2026
2550d12
Update worker_supervisor.ex
galaddirie Apr 9, 2026
85c894d
Update TODO.md
galaddirie Apr 9, 2026
926c4be
Add runtime slot binding system and UI
galaddirie May 7, 2026
9127477
Rename subnode slots to inputs, refactor providers
galaddirie May 11, 2026
9605d97
Rename subnode_slots to subnode_inputs in docs
galaddirie May 11, 2026
01262f4
Add user_id to workflow runs and triggers
galaddirie May 11, 2026
e645e43
Emit submit_slot_bindings and add types
galaddirie May 11, 2026
8042aee
Update TODO.md
galaddirie May 11, 2026
b224d66
Add configurable Litestream log level
galaddirie May 11, 2026
78305d2
Add Google Sheets integration and AI schema support
galaddirie May 11, 2026
d0ee0a5
Add MapEditor and Google Sheets named-row support
galaddirie May 15, 2026
0ac6c59
Add WorkOS scoped-pipes reauth widget
galaddirie May 23, 2026
c1a18ea
Index connections, summarize payloads, sqlite
galaddirie May 25, 2026
0853552
Add claiming, concurrency controls & draft limits
galaddirie May 25, 2026
59fcc91
refactor: use genstage runnable dispatcher and consumers
galaddirie May 25, 2026
4423ab2
Add integration audit, n8n research, refactor plan
galaddirie May 25, 2026
8931099
feat(integrations): add metadata-first catalog foundation
galaddirie May 25, 2026
9ef8cfd
refactor: add resource locator/mapper field support
galaddirie May 26, 2026
d824f3d
Replace slot bindings with credential bindings
galaddirie May 27, 2026
4944cce
Refactor Google Sheets operations & credential UI
galaddirie May 27, 2026
fd4c8c2
Migrate credential modules to Fizz.Fields
galaddirie May 27, 2026
571ed1e
Add durable operation retries and step errors
galaddirie May 27, 2026
77f8aaf
Collapse operations into step executors
galaddirie May 27, 2026
6e600a4
Move executors under Integrations, add test harness
galaddirie May 27, 2026
67ad1ed
refactor(integrations)!: reorganize integration library modules
galaddirie May 27, 2026
4038ff9
Restructure integrations into subfolders
galaddirie May 28, 2026
59d1144
Introduce dependency inputs & chat model providers
galaddirie May 28, 2026
3a937f0
Add AI model catalog and search resolvers
galaddirie May 28, 2026
e6cc54c
Update README.md
galaddirie May 31, 2026
c8a5aba
Delete ADDING_INTEGRATION.md
galaddirie May 28, 2026
1cb5a92
Normalize provider responses and struct outputs
galaddirie May 28, 2026
2f3f4d6
refactor(workflows): rough
galaddirie May 28, 2026
830e8ea
Revert "refactor(workflows): rough"
galaddirie Jun 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 14 additions & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,20 @@
"Bash(mix assets.build:*)",
"Bash(wc:*)",
"Bash(npx vue-tsc:*)",
"Bash(tail:*)"
"Bash(tail:*)",
"Bash(mix deps.tree)",
"Bash(xargs basename:*)",
"Bash(find /Users/galdirie/code/fizz/deps/runic -type f -name *.ex)",
"WebFetch(domain:hexdocs.pm)",
"WebFetch(domain:github.com)",
"WebFetch(domain:litestream.io)",
"WebFetch(domain:hex.pm)",
"Bash(find /home/galad/code/fizz/deps/live_vue -name *.ex -o -name *.js -o -name *.ts)",
"WebFetch(domain:raw.githubusercontent.com)",
"mcp__plugin_context7_context7__resolve-library-id"
]
},
"enabledPlugins": {
"superpowers@claude-plugins-official": false
}
}
Empty file added .codex
Empty file.
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ fizz-*.tar

# Ignore assets that are produced by build tools.
/priv/static/*
/priv/workflow_data/

# In case you use Node.js/npm, you want to ignore these.
npm-debug.log
Expand All @@ -38,3 +39,8 @@ node_modules/

.env
.env.*


.DS_Store

*.deb
45 changes: 45 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,49 @@
# Fizz
<img width="1508" height="785" alt="example_workflow" src="https://github.com/user-attachments/assets/2e42b3ca-f7cc-4c29-b0d7-6b762f880215" />

## Local Stack

The durable workflow stack runs locally against the real components:

- Postgres in Docker
- MinIO as an S3-compatible replica target for Litestream
- node-local SQLite files under `priv/workflow_data`
- the real `litestream` binary on your host `PATH`

Start the local resources:

```bash
docker compose -f docker-compose.resources.yml up -d
```

Useful local endpoints:

- App: [http://localhost:4000](http://localhost:4000)
- Adminer: [http://localhost:8080](http://localhost:8080)
- MinIO API: [http://localhost:9000](http://localhost:9000)
- MinIO Console: [http://localhost:9001](http://localhost:9001)

Development defaults are already wired for the workflow stack:

- bucket: `fizz-workflows-dev`
- endpoint: `http://127.0.0.1:9000`
- access key: `minioadmin`
- secret key: `minioadmin`
- workflow data dir: `priv/workflow_data`

Override them with environment variables when needed:

- `WORKFLOW_DATA_DIR`
- `LITESTREAM_S3_BUCKET`
- `LITESTREAM_S3_PREFIX`
- `LITESTREAM_AWS_REGION`
- `LITESTREAM_S3_ENDPOINT`
- `LITESTREAM_S3_SKIP_VERIFY`
- `LITESTREAM_LOG_LEVEL` (defaults to `warn`)
- `LITESTREAM_ACCESS_KEY_ID`
- `LITESTREAM_SECRET_ACCESS_KEY`

## App Setup

To start your Phoenix server:

Expand Down
62 changes: 60 additions & 2 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

3. [High] Execution runs under workflow owner scope, not triggering user scope.
lib/fizz/runtime/execution/server.ex:271 builds runtime scope from execution.workflow.user and
workspace, while execution records track triggered_by_user_id from request time (lib/fizz/
project, while execution records track triggered_by_user_id from request time (lib/fizz/
executions.ex:221).
This can produce permission drift for preview/partial runs.
Better pattern: resolve runtime scope from triggered_by_user_id when present, fallback to system
Expand Down Expand Up @@ -114,4 +114,62 @@ for the demo we will show a workflow that constantly adds + 1 to a number stored

simple email agent with human in the loop for deletion of emails

add a chat endpoint that can use natural language to determine which workflow to run based on the user's input. it will use workflow names, descriptions, and workspaces to determine the best workflow to run. could run multiple workflows - this is a ux feature
add a chat endpoint that can use natural language to determine which workflow to run based on the user's input. it will use workflow names, descriptions, and projects to determine the best workflow to run. could run multiple workflows - this is a ux feature



workflow example idea

A bot that starts an a/b experiment and updates the experiments based on events and signals from Google Analytics or the website itself updating the experiment continuously.

bot that can detect errors, triage them, and update the website, then emails the user the issue and the fix.



- [ ] Users should be able to pin data without needing to run a node. they should be able to paste a payload of their shape
- [ ] add loop zone like ui from blender to spliter aggregate pairs. add ux that lets user paginate through the iterations


bugs


- When we open a a debug workflow mode by visting workflow/<workflow_id>/edit/runs/<run_id>, it does not rebuild the graph from the logs, it shows the current a view with the currentdraft model ( have not tested with published workflows )


what should the debug view show? what should the user experience be? how will users debug and pin workflows on published versions or previous drafts if they drift significantly from the current draft?

c/workflows/\/edit/runs/648c061d-0b09-4cbe-9765-09fd578de200


BUG
Pinned outputs dont actually work. they appear to work in the ui on the pinned node (showing the input and the correct pinned output) but when you look at the downstream nodes, they are using real live output, not the pinned output.

we honestly shouldnt even be executing nodes with pinned outputs so how is this happening.

- Research workflow execution check points during live runs
- Research post-terminal SQLite /litestream/minio compaction: checkpoint completed/cancelled/failed workflows
- Research workflow compute scaling: LeaseManager start-run contention, repo pool pressure, and Litestream memory/file-watch growth under high concurrency.
Current benchmark snapshot: simple runs sustained ~80 runs/s, 500 sleeping workers stayed stable, but 1000-run launch bursts degraded sharply and a 200-concurrent start burst timed out in LeaseManager.acquire/1.
Validate whether the next bottleneck is the single GenServer lease path, Repo pool_size=10 in dev, or Litestream recursively watching too many terminal SQLite files.
Should we merge all field, resolver, and input logic into the slot system? extending it where needed?


working on integrations, I was wondering if oauth was correct for some apps.
We currently support oauth for google, slack, notion, box, github, and custom api keys like openai, anthropic, etc. we do have api keys for platforms that also have oauth like microsoft, github, etc.

but is this correct for all apps? what would it look like if users wanted make a slack/discord bot, what about a github app? what about google?

add settings page, need to reconcile ux on how we we will display editor/owner settings like workflow name, deleting the workflow etc. and how to handle viewers/runners who need to manage things like what credentials they have bound.



issues
- for fields like a object inut, we shouldnt show tree and table views, just json, that also means hide the otions/tab selectors
-rename structured schema sub node slot to schema
- do we need to differentiate between fixed and expression? might be unnecessary
- but what about special ui inputs like Row Values @MapEditor for google sheets append row? what if we dont want a special ui input and just want to send json, ex. you get a table structure from a upstream node, doesnt make sense to put that in a single cell via map editor input
map editor is already a "fixed" input but evaluates expressions inside the table.

-cant ctrl c + p copy and paste from step config model

- how should we organize custom ui? specific to a integration/provider like google
13 changes: 7 additions & 6 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,34 @@ tasks:
init:
desc: Initialize development environment
cmds:
- docker compose -f docker-compose.resources.yml up -d
- mix deps.get
- mix ecto.create
- mix ecto.migrate
- mix assets.setup
- mix assets.build

up:
desc: Start development services (PostgreSQL + Adminer)
desc: Start development services (PostgreSQL + MinIO + Adminer)
cmds:
- docker-compose -f docker-compose.resources.yml up -d
- docker compose -f docker-compose.resources.yml up -d

down:
desc: Stop development services
cmds:
- docker-compose -f docker-compose.resources.yml down
- docker compose -f docker-compose.resources.yml down

logs:
desc: Show logs from development services
cmds:
- docker-compose -f docker-compose.resources.yml logs -f
- docker compose -f docker-compose.resources.yml logs -f

restart:
desc: Restart development services
cmds:
- docker-compose -f docker-compose.resources.yml restart
- docker compose -f docker-compose.resources.yml restart

status:
desc: Show status of development services
cmds:
- docker-compose -f docker-compose.resources.yml ps
- docker compose -f docker-compose.resources.yml ps
4 changes: 2 additions & 2 deletions assets/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import topbar from "topbar"
import {getHooks} from "live_vue"
import liveVueApp from "../vue"
import {PipesWidget, WorkOSReactWidget} from "./hooks/workos_react_widgets"
import {SpriteConsole} from "./hooks/sprite_console"
import {WorkspaceConsole} from "./hooks/workspace_console"


const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
Expand All @@ -40,7 +40,7 @@ const liveSocket = new LiveSocket("/live", Socket, {
...getHooks(liveVueApp),
PipesWidget,
WorkOSReactWidget,
SpriteConsole,
WorkspaceConsole,
ScrollBottom: {
updated() { this.el.scrollTop = this.el.scrollHeight }
},
Expand Down
Loading