webofbits

webofbits

Squidie - workflow automation runtime for Elixir applications

Squid Mesh is an open source workflow automation runtime for Elixir applications.

It is aimed at Phoenix and OTP apps that want to define and run durable workflows in code without rebuilding the runtime layer around retries, replay, inspection, cancellation, and scheduling.

Core Idea

  • define workflows declaratively with triggers, payload contracts, steps, transitions, and retries
  • run them durably on top of an existing Repo and Oban
  • inspect run history with step and attempt details
  • replay and cancel runs through a small public API
  • activate recurring workflows through cron-backed triggers

Current Features

  • manual triggers
  • cron triggers
  • step retries with exponential backoff
  • built-in :wait and :log steps
  • run inspection with history
  • replay and cancellation
  • HTTP tool adapter support

Example Workflow

defmodule Content.Workflows.PostDailyDigest do
  use SquidMesh.Workflow

  workflow do
    trigger :daily_digest do
      cron("0 9 * * 1-5", timezone: "Etc/UTC")

      payload do
        field(:feed_url, :string, default: "https://example.com/feed.xml")
        field(:discord_webhook_url, :string)
        field(:posted_on, :string, default: {:today, :iso8601})
      end
    end

    step(:fetch_feed, Content.Steps.FetchFeed)
    step(:build_digest, Content.Steps.BuildDigest)

    step(:post_to_discord, Content.Steps.PostToDiscord,
      retry: [
        max_attempts: 5,
        backoff: [type: :exponential, min: 1_000, max: 30_000]
      ]
    )

    transition(:fetch_feed, on: :ok, to: :build_digest)
    transition(:build_digest, on: :ok, to: :post_to_discord)
    transition(:post_to_discord, on: :ok, to: :complete)
  end
end

Running from Host App

SquidMesh.start_run(Content.Workflows.PostDailyDigest, %{
  discord_webhook_url: System.fetch_env!("DISCORD_WEBHOOK_URL")
})

Under the Hood

  • Oban for durable execution and scheduling

  • Jido for custom step actions

  • Postgres for persisted run state

Status

This is still an early alpha release.

Current focus:

  • API shape

  • workflow contract

  • runtime model

Links

https://github.com/ccarvalho-eng/squid_mesh

First Post!

webofbits

webofbits

A bit more context on why Squid Mesh uses both Oban and Jido.

Oban is the durable execution backbone. Squid Mesh owns workflow state, retries, replay, cancellation, inspection, and step progression, but it still needs a strong execution layer underneath for queueing, scheduling, redelivery, and background execution across restarts and deploys. I didn’t want Squid Mesh to re-implement a job runtime when Oban is already very good at that layer.

Jido is currently used mostly at the step/action boundary. Right now that means custom workflow steps can be expressed as Jido actions instead of every app inventing its own step contract. That part is useful already, but I also think Jido could play a bigger role over time if Squid Mesh grows more agent-oriented execution patterns, richer action libraries, or more AI-heavy workflow steps. So today Oban is the more foundational dependency, while Jido is more about the execution contract and future direction.

On “why not just use Oban workflows?”: I think that’s a fair question. If a team already has Oban Pro and is happy building directly at that layer, Squid Mesh may be unnecessary. The reason this project exists is to provide a higher-level workflow runtime for application code: workflows as a first-class app concept, with a DSL, run/step/attempt history, replay, cancellation, cron-backed triggers, and a small public API around them. So the goal isn’t to compete with Oban as a job system, but to sit one layer above it.

If helpful, a simple way to describe the split is:

  • Oban handles durable execution
  • Jido handles custom step actions
  • Squid Mesh handles workflow semantics

Most Liked

webofbits

webofbits

i started laying the foundations and milestones for https://github.com/dark-trench/squid_studio (the visual editor)
it should help identify the remaining gaps in squidie to support visual editors
also, new name → new logo :sweat_smile:

webofbits

webofbits

Longer term, this is something I could imagine building after the runtime matures further: a visual companion for inspecting Squid Mesh workflows and run state. For now I’m staying focused on the runtime, durability, and host-app integration, but I like the idea of eventually making workflow shape, transitions, retries, and manual gates easier to see at a glance.

Last Post!

webofbits

webofbits

SquidSonar update

We’ve merged several improvements:

  • Upgraded Phoenix and LiveView across the package and example app.
  • Added tabbed run details with deep-linkable views for timelines, workflows, attempts, recovery, and raw data.
  • Added chronological execution timelines with safe redaction and partial-data handling.

Where Next?

Popular in Announcing Top

Hal9000
Here is my first stab at this. README pasted below. https://github.com/Hal9000/elixir_random Comments and critiques are welcome. Thank...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36820 110
New
Azolo
Hey everyone, I just released WebSockex which is a Elixir WebSocket client. WebSockex strives to work as a OTP special process, be RFC6...
New
maltoe
Hello! Came here to announce ChromicPDF, a pet project PDF generator I’ve been working on for the past few months. Why another PDF gener...
New
oltarasenko
Dear Elixir community, After a year of development, bug fixes, and improvements, we are proudly ready to share the release of Crawly 0.1...
New
tmbb
PhoenixWS - Websockets over Phoenix Channels Source code on Github here: GitHub - tmbb/phoenix_ws: Websockets implemented over Phoenix Ch...
New
kevinlang
Hey all, We have made an Ecto3 Adapter for SQLite3, ecto_sqlite3! We have successfully on-boarded the full suite of integration tests (...
New

Other popular topics Top

baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

We're in Beta

About us Mission Statement