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

# Your First Test Run

> The first thing to try: init, serve, ingest, query, verify against the local filesystem, no Sia account needed.

This is the tutorial to start with if you're new to ObsidianLog. It uses
the local backend, so there's nothing to set up beyond downloading a
binary. If it works here, you know the core pipeline (encrypt, compress,
hash-chain, query, verify) is solid before you touch Sia at all.

Takes about five minutes.

## 1. Get the binary

If you haven't already, download and extract the release binary for your
system. [Installing a release binary](/get-started/quickstart#installing-a-release-binary)
in the Quickstart has the full walkthrough for macOS, Windows, and Linux.
Not sure which file to grab in the first place? See the
[FAQ](/get-started/faq).

## 2. Run init

<Tabs>
  <Tab title="macOS / Linux">
    ```sh theme={null}
    ./obsidianlog init
    ```
  </Tab>

  <Tab title="Windows">
    On some machines, PowerShell doesn't set the environment variable
    ObsidianLog looks for by default. Set it once per window, then every
    command below works exactly like the macOS/Linux commands, no
    `--config` needed:

    ```powershell theme={null}
    $env:HOME = $env:USERPROFILE
    .\obsidianlog.exe init
    ```
  </Tab>
</Tabs>

You'll be asked a handful of questions: storage bucket name, which
backend (choose **local**), where to store data on disk, the ingest
server's bind address, and the chunk time window. The defaults are fine
for testing, just press Enter through each one.

On macOS, you should see **at most one** keychain authorization prompt
during this step. Click **Always Allow** rather than just Allow, so later
commands don't ask again.

When it finishes, you'll see something like:

<Tabs>
  <Tab title="macOS / Linux">
    ```text theme={null}
    obsidianlog initialized.
      config:      /Users/you/.config/obsidianlog/config.toml
      credentials: the OS keychain
    ```
  </Tab>

  <Tab title="Windows">
    ```text theme={null}
    obsidianlog initialized.
      config:      C:\Users\you\.config\obsidianlog\config.toml
      credentials: the OS keychain
    ```
  </Tab>
</Tabs>

## 3. Start the server

<Tabs>
  <Tab title="macOS / Linux">
    ```sh theme={null}
    ./obsidianlog serve
    ```
  </Tab>

  <Tab title="Windows">
    ```powershell theme={null}
    .\obsidianlog.exe serve
    ```
  </Tab>
</Tabs>

The terminal won't return to a prompt after this, it keeps running and
waiting for log batches. That's expected, leave it running and open a new
terminal for the rest of this tutorial.

## 4. Send it a test log

<Tabs>
  <Tab title="macOS / Linux">
    ```sh theme={null}
    curl -s -X POST http://localhost:7080/ingest \
      -H 'content-type: application/json' \
      -d '[{"timestamp":"2026-09-18T10:00:00Z","service":"tutorial","level":"info","msg":"hello from the local backend"}]' \
      -w '%{http_code}\n'
    ```
  </Tab>

  <Tab title="Windows">
    This is a new window, so run `$env:HOME = $env:USERPROFILE` here too
    first (it's per-window, not sitewide). Assign the JSON to a variable
    before sending it, PowerShell's quoting breaks on a curl command
    written the Unix way:

    ```powershell theme={null}
    $json = '[{"timestamp":"2026-09-18T10:00:00Z","service":"tutorial","level":"info","msg":"hello from the local backend"}]'
    curl.exe -s -X POST http://localhost:7080/ingest -H "content-type: application/json" -d $json -w "%{http_code}\n"
    ```
  </Tab>
</Tabs>

A successful ingest has an empty body, so the `200` printed on its own
line (from `-w`) is the actual confirmation, not the absence of output.
Without `-w`, a successful request and a hung one look identical: no
output either way, so it's included above rather than left optional.

## 5. Query it back

<Tabs>
  <Tab title="macOS / Linux">
    ```sh theme={null}
    ./obsidianlog query --service tutorial --format human
    ```
  </Tab>

  <Tab title="Windows">
    ```powershell theme={null}
    .\obsidianlog.exe query --service tutorial --format human
    ```
  </Tab>
</Tabs>

You should see the log line you just sent, decrypted and printed back
to you.

## 6. Verify the chain

<Tabs>
  <Tab title="macOS / Linux">
    ```sh theme={null}
    ./obsidianlog verify
    ```
  </Tab>

  <Tab title="Windows">
    ```powershell theme={null}
    .\obsidianlog.exe verify
    ```
  </Tab>
</Tabs>

This walks the hash chain and confirms nothing archived has been
tampered with. You'll see a line starting with `OK` naming the
`tutorial` service and how many chunks were verified.

## Tell us how it went

That's the whole loop. Whether it went smoothly or you got stuck
somewhere, please open a
[feedback report](https://github.com/emmaglorypraise/ObsidianLog/issues/new?template=feedback.yml)
either way, any bugs, friction, or feature requests are worth mentioning.

## What's next

If this worked, try [Connecting to Sia](/tutorials/sia-backend) to
see it archive to the real Sia network instead of your local disk, or
[Trying Out Vector](/tutorials/vector-integration) to see a real log
shipper feed it instead of a single `curl` request.

This already set up your real, default config, not a scratch folder, so
there's nothing further to migrate. Try
[Returning User](/tutorials/returning-user) next.

When you finish the tutorial, return to the terminal running `serve` and
press `Ctrl-C` to stop it.
