Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
9093444
fix(ui): restore docs layout below lg and unclip the header menus
folathecoder Oct 14, 2026
4122310
fix(header): group the search with the right-hand controls below lg
folathecoder Oct 14, 2026
10fea50
design(tokens): semantic token layer, type scale, and IBM Plex Sans
folathecoder Oct 14, 2026
f8da1c9
design(primitives): restyle controls, search palette, and copy buttons
folathecoder Oct 14, 2026
4b2da42
design(shell): header, sidebar, and table of contents on the new tokens
folathecoder Oct 14, 2026
8f6a0bd
design(pages): doc, changelog, standalone, and 404 pages on the tokens
folathecoder Oct 14, 2026
ab01fa9
copy: specific tagline and two content phrases
folathecoder Oct 14, 2026
a561cda
cleanup: remove legacy token aliases and fix the orphan docblock
folathecoder Oct 14, 2026
7f292ed
a11y: accessible names match visible text; 24px TOC rows
folathecoder Oct 14, 2026
55efdf8
a11y: name the search trigger from its text, not an aria-label
folathecoder Oct 14, 2026
def2e30
seo: metadata system, structured data, dates from git, sitemap, redir…
folathecoder Oct 14, 2026
39cf202
content: search-result titles and descriptions for every page
folathecoder Oct 14, 2026
b376aba
brand: Steps mark, favicon set, manifest, and Open Graph card on the …
folathecoder Oct 14, 2026
146cd6e
a11y: 24px heading anchors and breadcrumb link
folathecoder Oct 14, 2026
4ce2be6
og: allow a two-line subtitle on the card
folathecoder Oct 14, 2026
4669851
brand: favicon.ico on a paper tile so it reads on dark tab strips
folathecoder Oct 14, 2026
a5bea16
seo: SoftwareApplication links its repository via sameAs
folathecoder Oct 14, 2026
f6138a9
creator: profile page for Folarin Akinloye, indexable and intentional…
folathecoder Oct 14, 2026
32a92c6
creator: add the five approved projects to selected work
folathecoder Oct 14, 2026
a826d41
creator: use next/link for internal links
folathecoder Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ npx tsc --noEmit # type check
npm run build # static export build
```

## Intentionally unlinked pages

- `/creator` (`src/app/creator/page.tsx`) is the creator profile. It is indexable (200, self-referencing canonical, listed in `sitemap.xml`) but deliberately absent from the header, sidebar, footer, and search index, and nothing links to it internally. That is a product decision, not an oversight. Keep it that way unless the decision changes.

## Machine-readable endpoints

- `/changelog.xml`: RSS feed for releases.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/core-concepts/agent-loop.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: The Agent Loop
slug: agent-loop
description: One async generator drives every run, one iteration at a time.
order: 1
metaTitle: "The agent loop: one generator drives every run"
metaDescription: "How one generator runs each iteration: render the prompt, stream the model, run tool calls, record the step, and stop at a final answer or the step limit."
---

The whole framework hangs off a single async generator, `AgentSession._run_stream`. `run()` is a thin dispatcher: in streaming mode it hands back that generator, and in blocking mode it drains the generator and returns the final answer. There is no second implementation to keep in sync.
Expand Down
4 changes: 3 additions & 1 deletion content/docs/core-concepts/memory.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Memory
slug: memory
description: A run is a list of typed steps that serialize, replay, and resume.
order: 3
metaTitle: "Memory: typed steps that persist and resume"
metaDescription: "A run is a list of TaskStep, ActionStep, and FinalStep objects. Each renders into model messages and saves as JSON for persistence, replay, and resuming."
---

A run is recorded as a list of typed steps rather than a flat list of messages. Steps know how to render themselves back into model messages and how to serialize to JSON, which gives you persistence, replay, and multi-turn continuation without extra machinery.
Expand Down Expand Up @@ -41,7 +43,7 @@ await restored.run("A follow-up", reset=False)

Loading validates the payload as it rebuilds the steps. A malformed or incompatible payload raises `MemoryLoadError` rather than silently producing a broken session. See [Errors](/docs/reference/errors) for the full exception hierarchy.

## What this unlocks
## What this enables

Because the full run state lives in one serializable object, several features fall out for free:

Expand Down
2 changes: 2 additions & 0 deletions content/docs/core-concepts/skills.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Skills
slug: skills
description: Instruction folders the model loads on demand, catalog first.
order: 5
metaTitle: "Skills: instruction folders loaded on demand"
metaDescription: "Put a SKILL.md folder in your project. The model sees its name and summary in a catalog and loads the full instructions only when it decides it needs them."
---

A skill is a folder containing a `SKILL.md` file: YAML frontmatter followed by a markdown body of instructions. Skills let you package expertise, and progressive disclosure keeps them cheap until the model actually needs them.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/core-concepts/streaming-events.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Streaming Events
slug: streaming-events
description: A small set of typed events reports everything the loop does.
order: 4
metaTitle: "Streaming events: typed events from every run"
metaDescription: "The small set of typed events the loop emits while it runs: text deltas, tool calls, tool results, and the final event, and how to consume them."
---

The loop communicates progress through a small set of frozen event types. Pass `stream=True` to `run()` and you get an async iterator of these events; leave it off and the same generator is drained for you. One code path serves both modes.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/core-concepts/tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Tools
slug: tools
description: Plain Python functions become schema-validated tools with @tool.
order: 2
metaTitle: "Tools: plain Python functions with @tool"
metaDescription: "Turn a typed Python function into a schema-validated tool with @tool. Docstrings become descriptions, exceptions become observations, timeouts per call."
---

A tool is any Python function wrapped with `@tool`. The function name becomes the tool name, the docstring summary becomes the description, and the type hints plus a Google-style `Args:` section become the JSON Schema the model sees.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/getting-started/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Installation
slug: installation
description: Install agentling with pip or uv and configure your provider key.
order: 2
metaTitle: "Install Agentling with pip or uv"
metaDescription: "Install agentling with pip or uv on Python 3.11 or newer, set an API key for OpenAI or any compatible provider, and check the install in one command."
---

Install agentling from PyPI:
Expand Down
2 changes: 2 additions & 0 deletions content/docs/getting-started/introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Introduction
slug: introduction
description: What Agentling is, the idea behind it, and when to reach for it.
order: 1
metaTitle: "What Agentling is and when to use it"
metaDescription: "What Agentling is, the loop it is built on, what you get (typed memory, streamed events, self-healing tools, skills), and when to use something else."
---

Agentling is a small async Python framework for building tool-using agents. It gives you a clean ReAct loop, typed memory, streaming events, and recoverable failures in an auditable codebase.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/getting-started/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Quickstart
slug: quickstart
description: Build, run, and stream your first agent in a few lines of Python.
order: 3
metaTitle: "Quickstart: build and stream your first agent"
metaDescription: "Define a tool with @tool, create an Agent with a model, run it, then stream events from the same loop. About 30 lines of Python from start to finish."
---

This page takes you from an empty file to a streaming agent with one tool.
Expand Down
2 changes: 1 addition & 1 deletion content/docs/guides/_section.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Guides
slug: guides
description: Task focused guides for building production ready agents.
description: "How to run agents in production: sessions, persistence, interruption, error handling, and other providers."
icon: compass
order: 3
---
2 changes: 2 additions & 0 deletions content/docs/guides/error-handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Error Handling
slug: error-handling
description: Self-healing tool errors, timeouts, redaction, output truncation, and the retry behavior of the model layer.
order: 4
metaTitle: "Error handling: self-healing tools and retries"
metaDescription: "How tool exceptions become observations the model can fix, per-call timeouts, output truncation, error redaction, and the retry policy of the model layer."
---

agentling treats failure as something the model can recover from, not something that kills the run. This guide covers the layers of that design: self-healing tool errors, timeouts, redaction, and how the model layer retries.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/guides/interruption.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Interruption
slug: interruption
description: Stop a running agent gracefully with session.interrupt() and resume it exactly where it paused.
order: 3
metaTitle: "Interrupt a running agent and resume it"
metaDescription: "Stop a running agent gracefully with session.interrupt(), what the loop does at the next safe point, and how to resume from the step where it paused."
---

Sometimes you need to stop an agent mid-run: a user hits a stop button, a deadline passes, or your process receives a shutdown signal. agentling supports graceful interruption that preserves the run so you can resume it later.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/guides/other-providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Using Other Providers
slug: other-providers
description: Point OpenAIModel at any OpenAI-compatible endpoint, or implement the Model protocol for a custom provider.
order: 5
metaTitle: "Use other providers with OpenAIModel or Model"
metaDescription: "Point OpenAIModel at any OpenAI-compatible endpoint, or implement the small Model protocol to plug in a provider of your own."
---

agentling ships one provider adapter, `OpenAIModel`, but it is not tied to OpenAI. The adapter speaks to any OpenAI-compatible chat-completions endpoint, and the `Model` protocol lets you write your own adapter for anything else.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/guides/persistence-and-resuming.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Persistence and Resuming
slug: persistence-and-resuming
description: Serialize a session's memory to JSON, restore it later, and continue runs with reset=False.
order: 2
metaTitle: "Persist a session to JSON and resume it later"
metaDescription: "Serialize a session's memory to JSON, restore it in a new process, and continue the run with reset=False so the model picks up exactly where it stopped."
---

Every session records its run as typed memory that serializes to JSON. That gives you persistence, replay, and multi-turn continuation without any extra infrastructure.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/guides/sessions-and-concurrency.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Sessions and Concurrency
slug: sessions-and-concurrency
description: How Agent and AgentSession split configuration from run state, and how to run agents safely under concurrency.
order: 1
metaTitle: "Sessions and concurrency: Agent vs AgentSession"
metaDescription: "How Agent holds configuration and AgentSession holds per-run state, and the rules for sharing agents across tasks and running sessions concurrently."
---

agentling separates what an agent is from what a run does. An `Agent` is immutable configuration, and an `AgentSession` holds the state of one conversation. Understanding that split is the key to running agents safely under concurrency.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/reference/agent-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Agent API
slug: agent-api
description: Every Agent constructor parameter, the run method, and the AgentSession surface.
order: 1
metaTitle: "Agent API: constructor, run(), and AgentSession"
metaDescription: "Every Agent constructor parameter and its default, what run() and start() do, and the AgentSession surface for multi-turn, interruptible runs."
---

`Agent` is immutable configuration: a model, some tools, and settings. Build one once, share it freely, and let sessions carry the per-run state. This page lists every knob on the constructor and the semantics of `run()` and `start()`.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/reference/errors.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Errors
slug: errors
description: The exception hierarchy, which failures the model recovers from, and what redact_errors changes.
order: 4
metaTitle: "Errors reference: the exception hierarchy"
metaDescription: "Every exception under AgentlingError, which failures the loop recovers from on its own, and what redact_errors changes about what the model sees."
---

Every exception agentling raises lives under a single base class, `AgentlingError`, so one `except` clause can catch anything the framework produces. Just as important is what does not raise: most tool failures are converted into observations the model can recover from instead of crashing the run.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/reference/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Events
slug: events
description: Every streaming event type, what it carries, and how to consume the stream.
order: 3
metaTitle: "Events reference: every streaming event type"
metaDescription: "Every event the loop can emit, the fields each one carries, and how to consume the stream in blocking and streaming modes."
---

When you call `run(task, stream=True)`, the loop communicates progress through a small set of frozen event types. This page is the reference for each one and for `print_events`, the ready-made consumer.
Expand Down
2 changes: 2 additions & 0 deletions content/docs/reference/openai-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: OpenAIModel
slug: openai-model
description: The built-in provider adapter, its retry policy, and the Model protocol for custom adapters.
order: 2
metaTitle: "OpenAIModel reference and the Model protocol"
metaDescription: "The built-in provider adapter: constructor options, its retry policy, how it streams, and the Model protocol a custom adapter must implement."
---

`OpenAIModel` is an adapter for any OpenAI-compatible chat-completions endpoint. It is the only place in agentling that knows OpenAI's wire format: it converts framework-neutral `ChatMessage` lists into provider payloads on the way out and converts responses back on the way in.
Expand Down
2 changes: 2 additions & 0 deletions content/pages/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
title: Contributing
slug: contributing
description: How to set up a development environment, run the checks, and contribute to agentling.
metaTitle: "Contributing: setup, checks, pull requests"
metaDescription: "Set up a dev environment with uv, run the test, lint, format, and type checks that CI runs, and open a pull request against the agentling repository."
---

Thanks for your interest in improving agentling. The framework stays deliberately small, so thoughtful contributions matter more than big ones.
Expand Down
2 changes: 2 additions & 0 deletions content/pages/privacy.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
title: Privacy Policy
slug: privacy
description: What data this website collects, what it does not, and your choices.
metaTitle: "Privacy policy: what this site collects"
metaDescription: "What this website collects, what it does not, which third parties are involved, and the choices you have."
---

Last updated: 7 July 2026
Expand Down
2 changes: 2 additions & 0 deletions content/pages/terms.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
title: Terms of Use
slug: terms
description: The terms that apply to this website and to the agentling open source software.
metaTitle: "Terms of use for this site and the software"
metaDescription: "The terms that apply to using this website and to the agentling open source software, which is MIT licensed."
---

Last updated: 7 July 2026
Expand Down
9 changes: 9 additions & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,15 @@ const nextConfig: NextConfig = {
outputFileTracingIncludes: {
"/**": ["./content/**/*", "./src/assets/fonts/**"],
},
// URLs that used to be linked from the site and still receive requests.
async redirects() {
return [
{ source: "/feed.xml", destination: "/changelog.xml", permanent: true },
{ source: "/blog", destination: "/changelog", permanent: true },
{ source: "/blog/:path*", destination: "/changelog", permanent: true },
{ source: "/roadmap", destination: "/changelog", permanent: true },
];
},
};

export default nextConfig;
Loading
Loading