> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kolaria.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Scheduled Automation

> Generate content daily, weekly, or monthly from repository and Linear activity in a lookback window

Schedules generate content at a fixed cadence from activity over a lookback window. They suit consistent output: weekly progress posts, monthly changelog roundups, a daily social image during a launch. You manage them under **Automation > Schedules** in the dashboard, through the `/v1/schedules` API, or with `notra schedules` in the [CLI](/devtools/cli).

## How schedules work

<Steps>
  <Step title="Schedule configuration">
    Choose daily, weekly, or monthly, plus the time of day in UTC.
  </Step>

  <Step title="Automatic trigger">
    At the scheduled time Kolaria starts a run for the schedule.
  </Step>

  <Step title="Activity analysis">
    The run collects pull requests, commits, and releases from the selected repositories, plus completed Linear work when Linear is connected, inside the lookback window.
  </Step>

  <Step title="Content generation">
    The content is written in the selected brand identity. If there is nothing worth writing about, the run is skipped.
  </Step>

  <Step title="Review">
    The result appears under **Content** as a draft, or as a published post when auto-publish is on.
  </Step>
</Steps>

## Schedule frequencies

<Tabs>
  <Tab title="Daily">
    Runs every day at a set time.

    **Configuration:**

    * Hour (0-23, UTC)
    * Minute (0-59)

    **Good for:** high-velocity teams, daily social posts during a launch, end-of-day changelog entries.
  </Tab>

  <Tab title="Weekly">
    Runs once a week on a set day and time.

    **Configuration:**

    * Day of week (0-6, where 0 is Sunday)
    * Hour (0-23, UTC)
    * Minute (0-59)

    **Good for:** Monday changelog roundups, Friday LinkedIn updates, a weekly blog post about what shipped.

    ```json Weekly schedule theme={null}
    {
      "frequency": "weekly",
      "dayOfWeek": 1,
      "hour": 9,
      "minute": 0
    }
    ```
  </Tab>

  <Tab title="Monthly">
    Runs once a month on a set day and time.

    **Configuration:**

    * Day of month (1-31)
    * Hour (0-23, UTC)
    * Minute (0-59)

    **Good for:** monthly product update blog posts, end-of-month recaps, monthly changelog newsletters.

    <Note>
      The schedule runs only on months that have the chosen day. Pick a day between 1 and 28 if you need a run every month.
    </Note>
  </Tab>
</Tabs>

## Lookback windows

Each schedule analyzes activity over one of five windows:

<ParamField path="current_day" type="string">
  From midnight UTC today until the run
</ParamField>

<ParamField path="yesterday" type="string">
  The previous calendar day (midnight to midnight UTC)
</ParamField>

<ParamField path="last_7_days" type="string" default>
  The past 7 days (default)
</ParamField>

<ParamField path="last_14_days" type="string">
  The past 14 days
</ParamField>

<ParamField path="last_30_days" type="string">
  The past 30 days
</ParamField>

<Info>
  Match the window to the cadence: `yesterday` or `current_day` for daily schedules, `last_7_days` for weekly, `last_30_days` for monthly.
</Info>

## Supported output types

<CardGroup cols={2}>
  <Card title="Changelog entry" icon="list-check">
    A concise summary of what shipped and why it matters. Supports auto-publish.
  </Card>

  <Card title="Blog post" icon="newspaper">
    A longer-form article explaining the feature in depth. Supports auto-publish.
  </Card>

  <Card title="LinkedIn post" icon="linkedin">
    A professional update to share with your network. Saved as a draft.
  </Card>

  <Card title="Tweet" icon="twitter">
    A short announcement for X. Saved as a draft.
  </Card>

  <Card title="Image" icon="image">
    A brand-matched social image generated from repository activity. Saved as a draft.
  </Card>
</CardGroup>

## Sources

A schedule needs at least one GitHub repository. Pick them in the **Sources** step of the dialog. When a Linear integration is connected and enabled, its completed work is included in every schedule run automatically, alongside the selected repositories, and shows up in the sources column of the schedule list.

## Create a schedule

<Steps>
  <Step title="Open Automation > Schedules">
    Click **New schedule**.
  </Step>

  <Step title="Name your schedule">
    Use a descriptive name such as "Weekly LinkedIn update". Names are limited to 120 characters.
  </Step>

  <Step title="Select sources">
    Choose one or more connected GitHub repositories.
  </Step>

  <Step title="Set the cadence">
    Daily, weekly (pick a day), or monthly (pick a day of month), plus the time. Times use UTC; the summary card also shows the next run in your local timezone.
  </Step>

  <Step title="Choose the lookback window">
    How far back to analyze activity.
  </Step>

  <Step title="Choose the content format">
    Changelog entry, blog post, LinkedIn post, tweet, or image.
  </Step>

  <Step title="Pick a brand identity and auto-publish">
    Use the default brand identity or pin one. Auto-publish is available for changelogs and blog posts.
  </Step>

  <Step title="Save">
    New schedules start enabled. Kolaria rejects a schedule that duplicates an existing one ("Schedule already exists").
  </Step>
</Steps>

### Through the API

The same schedule through the public API (scope `schedules.write`):

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.kolaria.com/v1/schedules \
    -H "Authorization: Bearer $KOLARIA_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Weekly LinkedIn update",
      "sourceType": "cron",
      "sourceConfig": {
        "cron": { "frequency": "weekly", "dayOfWeek": 1, "hour": 9, "minute": 0 }
      },
      "targets": { "repositoryIds": ["repo_123"] },
      "outputType": "linkedin_post",
      "outputConfig": { "brandVoiceId": "brand_abc" },
      "lookbackWindow": "last_7_days",
      "enabled": true,
      "autoPublish": false
    }'
  ```

  ```typescript fetch theme={null}
  const response = await fetch("https://api.kolaria.com/v1/schedules", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.KOLARIA_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      name: "Weekly LinkedIn update",
      sourceType: "cron",
      sourceConfig: {
        cron: { frequency: "weekly", dayOfWeek: 1, hour: 9, minute: 0 },
      },
      targets: { repositoryIds: ["repo_123"] },
      outputType: "linkedin_post",
      outputConfig: { brandVoiceId: "brand_abc" },
      lookbackWindow: "last_7_days",
      enabled: true,
      autoPublish: false,
    }),
  });
  const { schedule } = await response.json();
  ```
</CodeGroup>

`repositoryIds` are GitHub integration IDs from `GET /v1/integrations`. `dayOfWeek` is required for weekly schedules and `dayOfMonth` for monthly ones. `outputType` is one of `changelog`, `blog_post`, `linkedin_post`, `twitter_post`, or `image`. `lookbackWindow` defaults to `last_7_days` and `autoPublish` to `false`. List, update, and delete with `GET /v1/schedules?repositoryIds=repo_123`, `PATCH /v1/schedules/{scheduleId}` (full body), and `DELETE /v1/schedules/{scheduleId}`. A duplicate configuration returns `409`.

## Content generation context

Each run builds its prompt from:

* **Time range**: the lookback window, computed in UTC at run time
* **Repositories**: merged pull requests, commits, and releases across all selected repositories
* **Linear**: completed issues from every enabled Linear integration
* **Brand identity**: tone, audience, company details, and custom instructions

## Cron expressions

Kolaria derives a cron expression from your configuration and evaluates it in UTC:

<CodeGroup>
  ```bash Daily theme={null}
  # Daily at 09:00 UTC
  0 9 * * *
  ```

  ```bash Weekly theme={null}
  # Every Monday at 09:00 UTC
  0 9 * * 1
  ```

  ```bash Monthly theme={null}
  # 1st of every month at 09:00 UTC
  0 9 1 * *
  ```
</CodeGroup>

## Run a schedule now

Open the row menu on the Schedules page and choose **Run now**. The run uses the current time and the configured lookback window: running a weekly schedule on a Tuesday analyzes the 7 days before that Tuesday, not the days before the scheduled Monday. Run now requires an enabled schedule and an active subscription.

## Managing schedules

The Schedules page splits schedules into **Active** and **Paused** tabs. From the row menu you can:

* **Edit**: change the name, sources, cadence, lookback window, format, brand identity, or auto-publish. Timing changes take effect for the next run.
* **Pause** or **Enable**: turn the schedule off or on without deleting it.
* **Run now**: start a run immediately.
* **Delete**: remove the schedule.

A schedule whose repository integration was removed cannot be re-enabled until you edit it and pick another repository.

## Monitoring

* **Content** shows every generated post. Posts from a schedule are grouped into a collection per run.
* **Settings > Notifications** can email you when scheduled content is created, when generation fails, and when a run is skipped because there was nothing worth writing about.
* If the run hits GitHub's API rate limit, Kolaria waits 30 minutes and retries up to three attempts before marking the run as failed.
* If your plan quota for the format is used up and no AI credits are available, the run stops and workspace owners receive an email.

## Common use cases

<CardGroup cols={2}>
  <Card title="Weekly product updates" icon="calendar-week">
    A LinkedIn post every Monday summarizing the previous week.
  </Card>

  <Card title="Monthly changelogs" icon="file-lines">
    A changelog roundup on the 1st of each month, auto-published.
  </Card>

  <Card title="Daily launch content" icon="mug-hot">
    A daily tweet or image during a launch week from `yesterday`'s activity.
  </Card>

  <Card title="Monthly blog post" icon="newspaper">
    A long-form recap on the last 30 days for customers.
  </Card>
</CardGroup>

## Best practices

<AccordionGroup>
  <Accordion title="Match frequency to activity">
    Pick a cadence that matches your development pace. Teams shipping daily can use daily or weekly schedules; teams with monthly releases should schedule monthly.
  </Accordion>

  <Accordion title="Align lookback with frequency">
    * Daily schedule: `current_day` or `yesterday`
    * Weekly schedule: `last_7_days`
    * Monthly schedule: `last_30_days`

    A window much longer than the cadence repeats the same activity in consecutive posts.
  </Accordion>

  <Accordion title="Think in UTC">
    Schedule times are UTC. The summary card in the dialog shows the next run in your local timezone so you can double-check.
  </Accordion>

  <Accordion title="One format per schedule">
    Create separate schedules for separate outputs, for example a weekly changelog for customers and a weekly LinkedIn post for your network.
  </Accordion>

  <Accordion title="Review generated content">
    Treat scheduled content as drafts. Keep auto-publish off until you trust the output for that format.
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Schedule not running">
    **Check:**

    * The schedule is in the Active tab, not Paused
    * Your subscription is active and the format's quota (or AI credits) is not used up
    * The repository integration still exists and is enabled

    Use **Run now** to confirm the schedule can produce content at all.
  </Accordion>

  <Accordion title="Run skipped or no content">
    **Check:**

    * The repositories have activity inside the lookback window
    * The repositories are still connected and accessible
    * Linear is enabled if you expect issues to be included

    Runs with nothing meaningful to say are recorded as skipped; enable the Skipped notification to hear about them.
  </Accordion>

  <Accordion title="Content quality issues">
    **Check:**

    * The lookback window fits your activity level
    * The brand identity has a tone, audience, and custom instructions
    * You are analyzing the right repositories

    Adjust the window or the brand identity's custom instructions and run the schedule again.
  </Accordion>
</AccordionGroup>

## Next steps

<CardGroup cols={2}>
  <Card title="Event-based automation" icon="bolt" href="/automation/event-based">
    Trigger content generation from GitHub releases and pushes
  </Card>

  <Card title="Brand voice" icon="palette" href="/concepts/brand-voice">
    Customize tone and style for scheduled content
  </Card>
</CardGroup>
