Skip to main content

guides/getting-started.md

# Getting Started

## Installation

Add Exograph to your deps:

```elixir
def deps do
  [
    {:exograph, "~> 0.7"}
  ]
end
```

**Postgres is required.** ParadeDB's `pg_search` extension is optional — without
it, text search falls back to `pg_trgm` ILIKE, which is fast but not BM25-ranked.

Install `pg_trgm` if it is not already enabled:

```sql
CREATE EXTENSION IF NOT EXISTS pg_trgm;
```

## Index your project

Point Exograph at your source directories with `--migrate` to create the tables:

    mix exograph.index --repo MyApp.Repo --migrate lib

To also index tests and set a custom prefix:

    mix exograph.index --repo MyApp.Repo --migrate --prefix exograph lib test

From Elixir:

```elixir
{:ok, index} =
  Exograph.index("lib",
    repo: MyApp.Repo,
    prefix: "exograph",
    migrate?: true
  )
```

`migrate?: true` runs Exograph's Ecto migrations under the configured prefix.
Re-running is safe; migrations are idempotent.

## Search from CLI

Structural search — finds fragments matching an ExAST pattern:

    mix exograph.search 'Repo.get!(_, _)' --repo MyApp.Repo --migrate lib

Text search:

    mix exograph.search 'TODO' --text --repo MyApp.Repo --migrate lib

Regex search:

    mix exograph.search 'Repo\.get!\(' --regex --repo MyApp.Repo --migrate lib

Structural search with predicates:

    mix exograph.search 'def _ do ... end' \
      --repo MyApp.Repo --migrate lib \
      --contains 'Repo.transaction(_)' \
      --not-contains 'IO.inspect(_)'

## Start the web UI

    mix exograph.web --prefix exograph --port 4200

Open `http://localhost:4200`. The editor supports structural, text, and regex
modes. Pass `--database-url` or set `EXOGRAPH_DATABASE_URL` when not using an
application repo:

    EXOGRAPH_DATABASE_URL=postgres://localhost/mydb \
      mix exograph.web --prefix exograph --port 4200

## Index Hex.pm packages

Download and index packages straight from Hex.pm:

    mix exograph.index.hex --mode top --limit 1000 --concurrency 8

This streams: download tarball → extract to tmpdir → index → cleanup. Peak disk
usage is proportional to concurrency, not total package count. Already-indexed
packages are skipped automatically.

Watch progress live by adding `--web`:

    mix exograph.index.hex --mode latest --concurrency 8 --web --port 4200

The dashboard at `http://localhost:4200/progress` shows per-package status,
rate, and ETA.

Modes:
- `latest` — most recent version of each package (default)
- `top --limit N` — top N most-downloaded packages
- `all` — every published version

See [Package Indexing](package-indexing.md) for scale numbers and full options.

## Next steps

- [Querying](querying.md) — structural patterns, text/regex search, planning
- [DSL](dsl.md) — join code facts with structural predicates
- [Mix Tasks](mix-tasks.md) — all CLI options
- [Postgres and ParadeDB](postgres-paradedb.md) — performance tuning for large indexes