assemblyline.sh

Quickstart

This gets one step running on your machine with fob-worker. You don't need an account for any of it. The example step flags invoices above an approval limit.

You'll need Node.js 18 or later and git.

1. Install the CLIs

npm install -g @finopsbricks/fob-worker @finopsbricks/fob-orc

2. Create a worker repo from the template

git clone https://github.com/finopsbricks/worker-template.git worker-acme
cd worker-acme
rm -rf .git && git init

Replace the template's placeholders with your organisation's short name (here acme). On macOS:

grep -rl '{{' . --include='*.js' --include='*.json' --include='*.md' | xargs sed -i '' \
  -e 's/{{ORG_NAME}}/acme/g' -e 's/{{LOCATION}}/acme/g' \
  -e 's/{{WORKER_NAME}}/worker-acme/g' -e 's/{{WORKER_DESCRIPTION}}/Worker for acme/g'

On Linux, use sed -i instead of sed -i ''. Then install:

cp .env.example .env
npm install

3. Write a step

A step is a file under src/steps/ that exports defineStep(). Create src/steps/IN1__check_invoices/IN1_01_check.js:

import { defineStep } from '@fob/lib-worker';
import { z } from 'zod';

export default defineStep({
  slug: 'IN1_01_check',
  name: 'Check invoices',
  description: 'Flags invoices above the approval limit',
  inputSchema: z.object({
    approval_limit: z.number().default(5000),
    invoices: z.array(z.object({ number: z.string(), amount: z.number() })).default([]),
  }),
  outputSchema: z.object({ checked: z.number(), above_limit: z.array(z.string()) }),
  execute: async (config) => {
    const above_limit = config.invoices
      .filter((invoice) => invoice.amount > config.approval_limit)
      .map((invoice) => invoice.number);
    return { checked: config.invoices.length, above_limit };
  },
});

4. Run it on your machine

Save a test config as a scenario, in .orchestrator/scenarios/IN1_01_check/two-invoices.json:

{
  "invoices": [
    { "number": "INV-1001", "amount": 1250 },
    { "number": "INV-1002", "amount": 7400 }
  ]
}

Then run the step with it:

fob-worker steps run IN1_01_check --scenario two-invoices
Output:
------------------------------------------------------------
{
  "checked": 2,
  "above_limit": [
    "INV-1002"
  ]
}

   Output saved: temp/IN1_01_check.json
Step completed successfully

Edit the step and run it again. That's the loop.

5. Run it on the Orchestrator

To run the station on a schedule and get a work record for every run, you need an account: sign up, create an organisation in the Orchestrator, and create an API key for the worker. Then describe the line and station as JSON files, push them with fob-orc, start the worker and trigger a run:

fob-orc lines push --all
fob-orc stations push --all
fob-worker procs start
fob-orc stations run IN1

The full walkthrough, with the .env values and station files, is in Get started (parts 5 and 6).

Next

  • Concepts: how stations hand work to each other through bins.
  • Use with AI agents: let a coding agent take over the edit-and-run loop.