Docs

Package format

The dotjob.yaml specification, field by field.

A DotJob is one declarative file, dotjob.yaml. It is the single source of truth for the listing page, the install form and the runtime. This page documents spec v0.1 (draft).

Top-level fields

FieldTypeRequiredNotes
nameslugyesLowercase, hyphenated, unique within your publisher namespace.
versionsemveryesSee publishing & versioning.
titlestringyesShown in the catalogue. 2–5 words.
taglinestringyesOne sentence, ≤ 110 characters.
descriptionstringyesOne or two paragraphs for the listing page.
categoryenumyesresearch · monitoring · reporting · operations · web · sales · productivity · finance · crypto
priceobjectyes{ amount: number, unit: run | month }
schedulecron | presetyeson-demand, a cron string, or a preset such as weekly-monday-07:00.
connectslist<app>yesApps the job may touch. Anything not listed is unavailable at runtime.
inputsmapyesNamed, typed inputs. See below.
stepslistyesOrdered steps. See steps & guarantees.
outputslistyesWhat the user gets and where it lands.
guaranteeslistnoRuntime-enforced promises. Strongly recommended.
tagslist<string>noSearch keywords.

Inputs

Each input is a named entry with a type. Types can carry a parameter in angle brackets.

inputs
inputs:
  companies:
    type: list<string>        # text | list<T> | url | file<csv|pdf> | connection<app> | schedule
    min: 1
    max: 50
    description: Names or domains, one per line
  focus_areas:
    type: text
    optional: true            # inputs are required unless optional: true
    default: "funding, hiring"
  destination:
    type: connection<google-sheets>
    description: Sheet to write results to
PropertyApplies toMeaning
optionalallDefaults to false.
defaulttext, list, url, schedulePre-filled value the user can change.
min / maxlistItem count bounds.
patterntext, list<string>Regex each value must match.
acceptfileAllowed extensions, e.g. file<csv|xlsx>.
scopeconnectionNarrows a grant: read, write, or a resource type such as channel.

Price and schedule

price: { amount: 39, unit: month }   # or { amount: 29, unit: run }
schedule: "0 7 * * MON"               # cron, or: on-demand | daily-06:00 | weekly-monday-07:00 | every-15m

Monthly jobs must have a schedule other than on-demand. Per-run jobs may be on-demand or trigger-based (for example on: sheets.new_row).

Outputs

outputs:
  - sheet: inputs.destination          # a declared connection input
  - note: summarise                    # a step id — delivered as a note in the run
  - file: diffs/                       # an artefact folder attached to the run

Every output must reference either a connection input or a step id. Outputs are the only places a job may write; this is what no_writes_outside_destination checks.

Full example

dotjob.yaml
name: company-research-sprint
version: 1.4.0
title: Company Research Sprint
tagline: Research up to 50 companies and return a clean, sourced spreadsheet.
category: research
price: { amount: 29, unit: run }
schedule: on-demand
tags: [prospecting, market map, due diligence]

connects: [google-sheets, web, linkedin, crunchbase]

inputs:
  companies:
    type: list<string>
    max: 50
    description: Names or domains, one per line
  focus_areas:
    type: text
    optional: true
  destination:
    type: connection<google-sheets>
    scope: write

steps:
  - id: resolve
    do: resolve_companies(inputs.companies)
  - id: research
    do: gather_public_data(resolve, fields: [desc, hq, size, funding, people, news])
    parallel: true
  - id: score
    do: score_against(inputs.focus_areas)
  - id: write
    do: sheets.write(inputs.destination, rows: research + score, with_sources: true)
    safe: false
  - id: summarise
    do: summarise(highlights: 5)

outputs:
  - sheet: inputs.destination
  - note: summarise

guarantees:
  - every_field_has_source
  - no_writes_outside_destination

Continue with steps & guarantees.