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

# Build and explore a small graph

> Use a tiny Python project to learn the complete local workflow.

This example works without an API key. It makes the first query reproducible, instead of depending on names that may not exist in your repository.

## Create a project

Create a folder containing `app.py`:

```python app.py theme={null}
def normalize_email(email: str) -> str:
    return email.strip().lower()


def find_user(email: str) -> dict:
    return {"email": normalize_email(email)}


def login(email: str) -> dict:
    return find_user(email)
```

## Build the graph

From that folder, with Graphify installed:

```bash theme={null}
graphify extract . --code-only
graphify cluster-only . --no-label
graphify export html
```

Open `graphify-out/graph.html`, or read `graphify-out/GRAPH_REPORT.md`. The graph should contain the three functions and their call relationships. Exact IDs and report formatting can vary by release.

## Ask for context

```bash theme={null}
graphify query "how does login normalize an email?"
graphify explain "normalize_email"
graphify path "login" "normalize_email"
```

Look for the relationship from `login` to `find_user`, then to `normalize_email`. Check the associated source references. If a label matches several nodes, use the node ID returned by the query for a more precise lookup.

## Make a change

Add another helper or change a call, then refresh:

```bash theme={null}
graphify update .
graphify export html
```

Re-run the query and compare the connections. Graphify queries the saved graph, so changing a source file without updating the graph can leave an old answer.

## Move to your repository

Repeat the workflow from your repository root. Use [the assistant skill](/quickstart) to include model-assisted document context, or connect [MCP](/mcp/overview) for native agent tool calls.

<div aria-hidden="true" className="hidden [body:has(&)_.chat-assistant-floating-input::before]:!bg-transparent" />

<div role="navigation" aria-label="Documentation pages" className="not-prose mt-12 grid gap-4 sm:grid-cols-2">
  <a href="/guides/querying" rel="next" aria-label="Next: Ask better graph questions" className="group flex min-h-[112px] flex-col justify-center gap-3 rounded-xl border border-[#c7dbd0] !border-b-[#c7dbd0] bg-[#ffffff] px-6 py-5 text-[#062314] no-underline transition-colors hover:border-[#94b6a2] hover:!border-b-[#94b6a2] hover:bg-[#edf6f0] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-[#4dea9c] items-end text-right sm:col-start-2"><span className="flex items-center gap-2 text-[11px] font-medium uppercase tracking-[0.08em] text-[#586b60]">Next<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" aria-hidden="true"><path d="M9 5l7 7-7 7" /></svg></span><span className="text-[15px] font-semibold leading-6">Ask better graph questions</span></a>
</div>
