Stacklore Documentation

Stacklore automatically generates human-readable documentation for your infrastructure code — Ansible playbooks and roles, Terraform modules, and CI/CD pipelines. Connect a repo, and Stacklore reads every relevant file and produces structured docs your whole team can read and search.

Docs live in a portal — a private, searchable website scoped to your team. Members can browse by repo, search across everything, and ask natural language questions about your infra using the built-in AI chat.

Quick start

From zero to docs in about five minutes:

Create an account

Go to stacklore.io and sign up with your GitHub account or email. A personal workspace and portal are created automatically.

Connect a repo

In your dashboard, click Connect Repo. Select GitHub (or GitLab), enter the repo name in owner/repo format, and hit Connect. Stacklore starts scanning immediately.

Watch docs generate

The dashboard shows a coverage bar that fills as docs are generated. Each file Stacklore understands gets its own doc — Ansible roles, Terraform modules, pipelines. Larger repos take a few minutes.

Open your portal

Click View Portal or go to yourslug.stacklore.io. Browse docs, search by keyword, or open the chat bubble and ask a question about your infra.

Invite your team

Go to Team in the dashboard and invite colleagues by email. They'll get a link to create an account and access the portal.

Connect GitHub github

Click Continue with GitHub on the sign-in or sign-up page. You'll be redirected to GitHub to authorize Stacklore. Once authorized, Stacklore can read your repos to generate docs.

Tip: Stacklore only needs read access to your repositories. It never writes to your repos unless you enable the PR auto-commit feature (Pro plan).

Adding a GitHub repo

  1. From your dashboard, click Connect Repo
  2. Select GitHub from the platform dropdown
  3. Enter the repo as owner/repo-name — e.g. acme/infra
  4. Select the default branch (usually main or master)
  5. Click Connect

Stacklore registers a webhook on the repo so docs stay up to date when you push changes.

Connect GitLab.com gitlab

Click Continue with GitLab on the sign-in page to connect your gitlab.com account. The flow is the same as GitHub.

Adding a GitLab repo

  1. From your dashboard, click Connect Repo
  2. Select GitLab from the platform dropdown
  3. Enter the repo path as group/project or group/subgroup/project
  4. Click Connect

Self-hosted GitLab

If your team runs its own GitLab instance, you can connect it as a custom GitLab instance. This requires owner access to your Stacklore org.

Note: Your self-hosted GitLab must be reachable from Stacklore's servers. Instances behind a VPN or private network will need a public webhook URL (e.g. via ngrok in dev, or a publicly reachable hostname in prod).

Add the instance in Team settings

Go to Team → GitLab Instances → Add instance. Enter a display name (e.g. "Company GitLab") and the base URL (e.g. https://git.yourcompany.com). Save — you'll see a redirect URI.

Create an OAuth app in GitLab

In your GitLab instance, go to User Settings → Applications → New application. Set:

  • Redirect URI: the URI shown in Stacklore (copy it with the button)
  • Scopes: read_user, read_api, read_repository

Save and copy the Application ID and Secret.

Enter the credentials

Back in Stacklore, click Edit on the instance and paste the Application ID and Secret. Save.

Sign in and connect repos

Click Sign in with [instance name]. After authorizing, your self-hosted repos will appear in the Connect Repo form under the instance name.

Add a repo

From your dashboard, click Connect Repo and fill in:

FieldDescription
PlatformGitHub, GitLab.com, or a configured self-hosted instance
RepoFull path: owner/repo or group/subgroup/project
BranchThe branch to scan — defaults to main

After connecting, Stacklore scans the full file tree and begins generating docs. You can watch progress on the dashboard coverage bar.

Large repos: A repo with 200+ documentable files may take 10–20 minutes on first scan. Subsequent pushes only regenerate changed files.

What gets documented

Stacklore identifies and documents three categories of infrastructure files:

ansible Ansible

  • Role task files: roles/*/tasks/*.yml
  • Role variable files: roles/*/vars/*.yml, roles/*/defaults/*.yml
  • Role handlers: roles/*/handlers/*.yml
  • Top-level playbooks: *.yml at the repo root
  • Playbooks in playbooks/
  • Group/host vars: group_vars/, host_vars/

terraform Terraform

  • *.tf files in any directory
  • Module directories under modules/
  • Environment configs under environments/

pipeline CI/CD Pipelines

  • GitLab CI: .gitlab-ci.yml
  • GitHub Actions: .github/workflows/*.yml
  • Jenkinsfiles

Files that are skipped: README.md, *.sh, *.py, *.json, lock files, and plain inventory/config files with no documentable content.

Rescanning a repo

Stacklore automatically re-documents files when you push to the connected branch via webhook. You can also manually trigger a full rescan from the dashboard by clicking the ↺ Rescan button on a repo card.

Rescan is incremental — it skips files that are already documented and haven't changed. Use it if:

  • You added new files and want docs immediately without waiting for a push
  • You think some docs are out of date
  • Coverage seems lower than expected after initial scan

Doc titles

Stacklore generates context-aware titles so main.yml is always disambiguated:

File pathTitle
roles/deploy_app/tasks/main.ymldeploy_app · tasks
roles/deploy_app/vars/main.ymldeploy_app · vars
roles/deploy_app/tasks/setup.ymldeploy_app · setup.yml
check_blackhole.ymlcheck_blackhole.yml
group_vars/all.ymlgroup_vars/all.yml
modules/vpc/main.tfvpc · main.tf
.gitlab-ci.yml.gitlab-ci.yml

Portal overview

Every Stacklore org gets a hosted portal at yourslug.stacklore.io. The portal is a private, searchable documentation site for your team — think Confluence but auto-generated from your actual infra code.

From the portal, team members can:

  • Browse docs organized by repo and file type
  • Search across all generated documentation
  • Ask natural language questions using the AI chat (💬 button)

Your portal slug is set when you register (based on your company name) and can be changed in Team settings.

Managing portal access

The portal is private by default — only org members can sign in. To give someone access:

  1. Go to Team in your dashboard
  2. Click Send invite and enter their email
  3. They receive an invite link, create an account, and can access the portal

Alternatively, someone can visit your portal URL, click Request access, and you'll see the request in your Team tab to approve.

Portal members can also sign in with GitHub if their GitHub account is linked to their Stacklore account.

AI FAQ chat

Every portal has a chat interface (the 💬 button, fixed bottom-right). Team members can ask natural language questions about your infrastructure and get answers grounded in your actual docs.

How it works: When you ask a question, Stacklore searches your docs for relevant content, builds a context window, and asks Claude to answer using only your documentation. It won't make things up — if the answer isn't in your docs, it says so.

Tips for good questions

  • Be specific: "How do I deploy to staging?" is better than "how does deployment work"
  • Open a specific doc first, then ask — the chat scopes to that doc
  • Ask about variables, gotchas, or dependencies: "What variables does the deploy_app role require?"

Inviting members

Go to Team → Invite Member. Enter the email address and select a role. The invite is valid until accepted — you can see pending invites and revoke them from the Team tab.

When the invitee clicks the link, they're prompted to create a Stacklore account (or sign in if they already have one). After accepting they can access the portal immediately.

Roles

RolePortal accessDashboard accessCan invite
owner✓ Full access
member✓ View only
viewer

Each org has one owner (the account that created it). Ownership can be transferred from Team settings.

Supported file types

TypeExtensions / patternsBadge
Ansible.yml files matching Ansible patternsansible
Terraform.tfterraform
CI/CD Pipeline.gitlab-ci.yml, .github/workflows/*.yml, Jenkinsfilepipeline

More file types (Kubernetes manifests, Helm charts, Docker Compose) are planned for future releases.

Plans

FeatureFreeProTeam
Repos15Unlimited
Users1315
Hosted portal
AI doc generation
PR auto-commit docs
Priority generation
Doc approval workflow
Custom portal domain
Price$0$29/mo$79/mo

FAQ

Does Stacklore store my source code?

Stacklore reads your files to generate documentation, but does not persistently store raw source code. Only the generated documentation content is stored in Stacklore's database.

How does Stacklore know which YAML files are Ansible?

Stacklore uses a combination of path patterns and content heuristics. A .yml file is classified as Ansible if it's in a known Ansible directory (like roles/*/tasks/) or if its content contains Ansible-specific keywords like hosts:, tasks:, become:, or module names like ansible.builtin.copy.

What happens when I push to my repo?

Stacklore receives a webhook from GitHub or GitLab, identifies which files changed, and regenerates documentation only for those files. Unchanged files are not re-processed.

Can I use a custom AI model or API key?

Yes — org owners on any plan can configure a custom model, API key, and base URL in their org settings (contact support or use the admin panel). This lets you use your own Anthropic account or a compatible self-hosted model.

My repo has hundreds of files. How long will it take?

Initial scan time depends on how many documentable files Stacklore finds. A typical infra repo with 50–100 Ansible roles takes 5–10 minutes. You can watch progress on the dashboard coverage bar. Large monorepos may take longer — rescan skips files that are already documented, so subsequent runs are fast.

How do I remove a repo?

Click the repo card in your dashboard and select Disconnect. This removes all generated docs for that repo and unregisters the webhook. The original source code is unaffected.