Skip to main content

Manage Documentation Across All Your Repositories

Your team has documentation scattered across 23 repositories. Frontend docs in one place. Backend in another. Infrastructure somewhere else. Finding anything requires knowing which repo to searchβ€”and most new developers have no idea. ULPI fixes this by connecting all your repositories into one searchable knowledge base. This guide shows you:
  • πŸ”— How to connect repositories (2 minutes per repo)
  • βš™οΈ Configure what gets indexed (exclude drafts, temp files, etc.)
  • πŸ”„ Keep documentation automatically synced via webhooks
  • πŸ“Š Monitor indexing status and troubleshoot issues
  • πŸš€ Optimize for large organizations with 100+ repos
First time? Start with Getting Started for initial setup.Want to search? See Search Features for query techniques.

The Problem: Documentation Chaos

Your organization’s reality:
  • Before ULPI
  • After ULPI
23 repositories, each with their own docs:
backend-api/         β†’ API docs in /docs
frontend-web/        β†’ Component docs in /src/components
mobile-app/          β†’ Setup in README only
infrastructure/      β†’ Runbooks in /runbooks
auth-service/        β†’ Auth docs in wiki
payment-service/     β†’ No docs (comments only)
notifications/       β†’ Docs in Notion (not in repo)
legacy-monolith/     β†’ 5-year-old docs, probably outdated
... 15 more repos
To find β€œhow to deploy”:
  1. Guess which repo has deployment docs
  2. Clone repo (if you don’t have it)
  3. Search through /docs, README.md, /runbooks
  4. Find outdated doc from 2020
  5. Ask in Slack: β€œWhere are the current deployment docs?”
  6. 20 minutes wasted
New developer experience:
  • Doesn’t know repos exist
  • No idea where to look
  • Asks same questions for weeks
ULPI makes all your documentation searchableβ€”no matter which repo it’s in.

Quick Start: Connect Your First Repository

Get searchable docs in under 2 minutes:
1

Navigate to Repositories

Dashboard β†’ Repositories β†’ Click Connect Repository
Pro tip: Start with your most important repository (usually backend-api or main app)
2

Authorize Access

Click β€œConnect GitHub” (or GitLab/Bitbucket)ULPI requests read-only access:
  • βœ… Read repository contents
  • βœ… Register webhooks (for auto-sync)
  • ❌ No write access (cannot modify code)
Security: OAuth with encrypted token storage. Revocable anytime from GitHub settings.
3

Select Repositories

Choose connection strategy:
4

Wait for Indexing

ULPI automatically indexes your documentation:What’s happening:
  • Discovering all documentation files
  • Parsing Markdown content
  • Generating semantic embeddings
  • Building search index
Time estimates:
Repository SizeFilesIndexing Time
Small (starter)Less than 10030-60 seconds
Medium (typical app)100-1,0002-5 minutes
Large (monorepo)1,000-10,0005-15 minutes
You can configure MCP while waiting! Jump to Getting Started Step 3.
5

Verify Indexing Complete

Status changes from β€œIndexing…” to β€βœ… Indexed”Verify search works:
  1. Ask your AI assistant: β€œHow do I set up local development?”
  2. Should return results from your repository
  3. Click the GitHub link to verify it’s YOUR docs
Success! Your documentation is now searchable by AI.
Total time: 2 minutes + automatic indexing

Supported Git Platforms

ULPI works with all major Git providers:

GitHub

Full support:
  • GitHub.com (public and private)
  • GitHub Enterprise Server (self-hosted)
  • Organizations and personal accounts
  • All repository types
Setup: OAuth connection (1 click)Webhooks: Automatic registration

GitLab

Full support:
  • GitLab.com
  • Self-hosted GitLab (CE and EE)
  • Groups and subgroups
  • Project access tokens
Setup: OAuth or access tokenWebhooks: Automatic registration

Bitbucket

Full support:
  • Bitbucket Cloud
  • Bitbucket Server (self-hosted)
  • Workspaces and projects
  • Repository access keys
Setup: OAuth connectionWebhooks: Automatic registration

Gitea / Gogs

Full support:
  • Self-hosted Gitea
  • Gogs instances
  • Organizations
Setup: Access tokenWebhooks: Manual configuration requiredSetup guide β†’
Requirements for self-hosted instances:
  1. Publicly accessible URL (ULPI needs to reach your server)
    • OR: VPN connection to ULPI (Enterprise plan)
    • OR: Webhook proxy (we can help set this up)
  2. API access enabled
    • Most modern Git servers have API enabled by default
  3. Webhook support
    • For auto-sync on git push
    • Manual re-indexing available if webhooks aren’t possible
Enterprise support: Contact sales@ulpi.io for VPN peering or on-premise deployment.

What Gets Indexed (and What Doesn’t)

ULPI is smart about what to index:

Automatically Included

  • Documentation Files
  • Code Comments (Optional)
  • Wiki Pages (Optional)
Primary documentation:
βœ… README.md (root and all subdirectories)
βœ… docs/ directory (all Markdown files)
βœ… documentation/ directory
βœ… .github/ directory (CONTRIBUTING.md, ISSUE_TEMPLATE, etc.)
βœ… All .md and .mdx files anywhere
βœ… CONTRIBUTING.md, CODE_OF_CONDUCT.md
βœ… CHANGELOG.md, SECURITY.md
βœ… Architecture Decision Records (ADRs)
Example structure:
myrepo/
β”œβ”€β”€ README.md                    βœ… Indexed
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ getting-started.md       βœ… Indexed
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   └── authentication.md    βœ… Indexed
β”‚   └── guides/
β”‚       └── deployment.md        βœ… Indexed
β”œβ”€β”€ .github/
β”‚   β”œβ”€β”€ CONTRIBUTING.md          βœ… Indexed
β”‚   └── pull_request_template.md βœ… Indexed

Automatically Excluded

Files that are never indexed:
  • Build Artifacts
  • Binary Files
  • Git Internals
  • Large Files
❌ node_modules/
❌ vendor/
❌ dist/
❌ build/
❌ .next/
❌ out/
❌ target/
❌ .cache/
Why excluded: Generated files, not actual documentation

Custom Exclusions with .ulpiignore

Exclude specific files or patterns: Create .ulpiignore in repository root:
# .ulpiignore (syntax like .gitignore)

# Exclude generated API docs
/docs/api/generated/
/docs/auto-generated/

# Exclude drafts and WIP docs
**/drafts/**
**/*.draft.md
**/*.wip.md

# Exclude old/deprecated docs
/docs/archive/
/docs/deprecated/

# Exclude specific files
CHANGELOG.md          # Too noisy for search
TODO.md               # Internal only
NOTES.md              # Scratchpad

# Exclude translations (if you only want English)
/docs/i18n/
/docs/locales/

# Include specific files (negate exclusion)
!docs/archive/important-historical-doc.md
Pattern syntax:
  • * - Match any characters in filename
  • ** - Match any directories
  • ! - Negate pattern (include files that would be excluded)
  • / - Match from repo root
To apply changes:
  1. Commit .ulpiignore to repository
  2. Push to main branch
  3. Dashboard β†’ Repository β†’ Re-Index
Verify exclusions: Repository details β†’ Indexed Files β†’ Search for filename

Automatic Sync via Webhooks

Your documentation stays up-to-date automatically:

How Webhooks Work

  • Automatic Flow
  • What Triggers Re-Index
  • Setup (Usually Automatic)
  • Manual Setup (If Needed)
What happens when you push:Timeline:
  • Less than 1 second: Webhook received
  • 5-10 seconds: Job queued and fetched
  • 20-40 seconds: Re-indexed
  • 30-60 seconds: Searchable by AI
Total: 30-60 seconds from push to searchable
Symptoms: Push changes, but search results don’t updateCheck webhook status:
  1. Dashboard β†’ Repositories β†’ Select repo
  2. Look for β€œWebhook: Active βœ…β€ or β€œWebhook: Inactive βŒβ€
Common issues:
  1. Insufficient permissions
    • Need admin or write access to register webhooks
    • Ask repo admin to grant access
    • Or: Ask admin to manually add webhook
  2. Firewall blocking ULPI
    • Corporate firewall blocks api.ulpi.io
    • Whitelist: *.ulpi.io in firewall rules
    • Contact IT for approval
  3. Webhook deleted manually
    • Someone deleted webhook from GitHub/GitLab settings
    • Reconnect repository to re-register webhook
  4. Rate limiting (GitHub)
    • Hit GitHub API rate limit (5,000 requests/hour)
    • Wait 1 hour and try again
    • Or: Manually trigger re-index
Manual workaround: Repository details β†’ Re-Index button (forces re-index without webhook)

Repository Status & Monitoring

Track indexing status for all repositories:

Status Indicators

  • βœ… Indexed (Ready)
  • πŸ”„ Indexing (In Progress)
  • ❌ Failed (Error)
  • ⏸️ Paused (Disabled)
  • ⚠️ Webhook Inactive
Status: IndexedMeaning: All documentation is indexed and searchableWhat you can do:
  • Search works normally
  • AI assistants have access
  • Webhooks auto-sync on push
Action: None neededβ€”everything working

Repository Statistics

View detailed metrics:
  • Files & Content
  • Activity & Usage
  • Performance Metrics
  • Health & Errors
What’s indexed:
Total files indexed:     247
β”œβ”€β”€ Markdown files:      198
β”œβ”€β”€ README files:        32
β”œβ”€β”€ Code comments:       0 (disabled)
└── Wiki pages:          17

Total size:              4.2 MB
Average file size:       17 KB
Largest file:            156 KB (docs/api-reference.md)

Total chunks:            1,234
Average chunks/file:     5.2
Use this to:
  • Verify all expected docs are indexed
  • Identify large files that might need splitting
  • See if code comments should be enabled

Advanced Repository Management

For teams managing many repositories:

Multi-Branch Indexing

Index multiple branches simultaneously:
When to enable:
  1. Review docs before merging:
    • Index develop branch
    • Search docs in PR before merge
    • Verify documentation is complete
  2. Compare documentation across versions:
    • Index v1.x and v2.x branches
    • Search old docs: "API guide" branch:v1.x
    • Help users on older versions
  3. Pre-release documentation:
    • Index feature branches
    • Internal teams see upcoming features
    • External docs stay on main only
Available on: Pro and Enterprise plans
1

Enable Multi-Branch

Repository settings β†’ Branches β†’ Enable multi-branch indexing
2

Add Branches

Click Add Branch and configure:Specific branch:
develop
staging
production
Branch patterns:
feature/*        # All feature branches
release/*        # All release branches
hotfix/*         # All hotfix branches
Version branches:
v1.x
v2.x
v3.x
3

Search Specific Branches

Query syntax:
"API changes" branch:develop
"deployment" branch:v2.x
"new features" branch:feature/oauth-upgrade
Compare branches:
Search in main:    "authentication guide" branch:main
Search in develop: "authentication guide" branch:develop
See differences between production and development docs.
Cost consideration: Each branch counts as separate repository for indexing quota.
  • 1 repo + 2 branches = 3 repos for billing
  • Consider which branches are truly needed

Organization-Wide Deployment

Best practices for rolling out ULPI across large organizations:
Start with 3-5 critical repositories:Recommended pilot repos:
  • βœ… Main application (most searched)
  • βœ… Backend API (well-documented)
  • βœ… Infrastructure/runbooks (high value)
Goals:
  • Verify ULPI works with your setup
  • Gather feedback from early adopters
  • Identify documentation gaps
  • Measure search usage metrics
Success criteria:
  • 80%+ of searches return relevant results
  • AI assistants successfully use docs
  • 5+ active users searching daily
Connect 10-20 additional repositories:Prioritize by:
  1. High traffic - Most developers interact with
  2. Well-documented - Has quality docs to index
  3. Critical services - Auth, payments, core APIs
Communication:
  • Announce in eng-all Slack
  • Share pilot success metrics
  • Provide ULPI setup guide
  • Offer office hours for questions
Monitor:
  • Search volume per repository
  • Which docs get searched most
  • Error rates and indexing issues
Connect all remaining repositories:Bulk connection options:
  1. Automatic org-wide:
    • Settings β†’ Connect all organization repositories
    • Includes future repos automatically
  2. Selective by team:
    • Frontend team: Connect frontend repos
    • Backend team: Connect backend repos
    • etc.
Governance:
  • Designate ULPI admins per team
  • Create .ulpiignore guidelines
  • Document best practices
  • Regular audits of indexed repos
Training:
  • Record demo video
  • Write internal search tips guide
  • Add to onboarding checklist
Monthly tasks:
  • Review repositories with failed indexing
  • Archive disconnected old repos
  • Update documentation standards
  • Review most-searched queries (find doc gaps)
Quarterly:
  • Audit .ulpiignore files across repos
  • Review search analytics
  • Survey developer satisfaction
  • Optimize slow-indexing repos
Annually:
  • Review organization-wide metrics
  • Calculate ROI (time saved)
  • Plan documentation improvements

Repository Collections

Group related repositories for easier management:
  • By Team
  • By Environment
  • By Product
Frontend Collection:
- web-app
- mobile-app
- component-library
- design-system
Backend Collection:
- api-gateway
- auth-service
- payment-service
- notification-service
Use: Search only frontend docs when working on UI
Create collection:
  1. Dashboard β†’ Collections β†’ Create Collection
  2. Name: β€œFrontend Repos”
  3. Add repositories to collection
  4. Share collection with team
Search within collection:
"authentication" collection:frontend

Troubleshooting Common Issues

Symptom: Pushed changes to docs, but search results are staleDiagnosis checklist:
1

Check Webhook Status

Dashboard β†’ Repository β†’ Look for β€œWebhook: Active βœ…β€If inactive:
  • Re-register webhook (see manual setup above)
  • Check permissions (need admin access)
2

Verify File Location

Is file in indexed directory?
  • /docs/**/*.md βœ…
  • /documentation/**/*.md βœ…
  • README.md βœ…
  • /src/utils/README.md βœ…
  • /temp/draft.md ❌ (if in .ulpiignore)
Check: Repository β†’ Indexed Files β†’ Search for your file
3

Check .ulpiignore

# Check if file is excluded
cat .ulpiignore

# Common issue: excluded too broadly
/docs/  # ❌ Excludes ALL docs
/docs/drafts/  # βœ… Excludes only drafts
Fix: Update .ulpiignore, commit, re-index
4

Verify Branch

Pushing to indexed branch?Most repos index main only.
# Check current branch
git branch

# If on different branch:
git checkout main
git merge your-feature-branch
git push origin main
Or: Enable multi-branch indexing for your branch
5

Manual Re-Index

Force re-index as last resort:Repository details β†’ Re-Index buttonThis triggers:
  • Full re-scan of repository
  • Re-processing of all docs
  • Cache invalidation
Time: 30s - 5min depending on repo size
Still not working? Contact support with:
  • Repository name
  • File path that’s not updating
  • Last push timestamp
  • Webhook status
Normal indexing times:
  • Less than 100 files: 30s - 1min βœ…
  • 100-1,000 files: 1-3min βœ…
  • 1,000-10,000 files: 3-5min βœ…
  • 10,000+ files: 5-15min ⚠️
If taking much longer:1. Check file count:
Dashboard β†’ Repository β†’ "Total files: 47,234"
Monorepo with many docs? Consider:
  • Using .ulpiignore to exclude unneeded docs
  • Splitting into multiple repos
  • Indexing only /docs directory
2. Check for large files:
Dashboard β†’ Repository β†’ "Largest file: 45 MB"
Files >10MB are skipped. If many large files:
  • Split into smaller files
  • Convert large PDFs to Markdown
  • Use .ulpiignore to exclude
3. Check network issues:
  • ULPI must fetch all files from GitHub/GitLab
  • Slow network = slow indexing
  • Enterprise: Use VPC peering for faster access
4. Check GitHub API rate limits:
https://api.github.com/rate_limit
If limited: Wait 1 hour and retry5. Contact support:
  • If >10,000 files: We can optimize your indexing
  • If >30min: Something is wrong, we’ll investigate
Click error message for details. Common errors:β€œAccess Denied” / β€œ401 Unauthorized”:
  • OAuth token expired or revoked
  • Fix: Reconnect repository (re-authenticate)
β€œRepository Not Found” / β€œ404”:
  • Repository deleted or renamed
  • Fix: Disconnect old repo, connect new one
β€œRate Limit Exceeded”:
  • Hit GitHub API limit (5,000 requests/hour)
  • Fix: Wait 1 hour, retry automatically
β€œInvalid Markdown Syntax”:
  • Malformed Markdown file causing parser error
  • Fix: Check error log for file name, fix syntax
β€œNetwork Error” / β€œTimeout”:
  • Temporary network issue
  • Fix: Retry indexing (usually resolves itself)
β€œWebhook Payload Too Large”:
  • Pushed >1,000 files at once
  • Fix: Manual re-index (handles large changes)
View full error:
  • Repository details β†’ Error Log
  • Copy error message for support ticket
File not showing up in search?Checklist:
  1. Is it a Markdown file?
    • βœ… .md, .mdx
    • ❌ .txt (unless in /docs)
    • ❌ .pdf, .docx
  2. Is it in indexed directory?
    • βœ… /docs/, README.md, /documentation/
    • ❌ /temp/, /private/ (unless explicitly included)
  3. Not in .ulpiignore?
    # Check exclusions
    cat .ulpiignore
    
  4. File not empty?
    # Check file size
    ls -lh docs/my-file.md
    # Should be >0 bytes
    
  5. UTF-8 encoding?
    # Check encoding
    file -I docs/my-file.md
    # Should show: charset=utf-8
    
Verify file was indexed:
  • Repository details β†’ Indexed Files
  • Search for filename
  • If not listed β†’ Check above conditions
Force inclusion:
  • Add to .ulpiignore with negation:
    # Include specific file
    !temp/important-doc.md
    
Symptoms: Repository shows β€œAccess Denied”For personal repos:
  1. Dashboard β†’ Settings β†’ Git Connections
  2. Click Reconnect GitHub
  3. Authorize access to private repositories
  4. Select repository again
For organization repos:
  1. Check org approval:
    • GitHub β†’ Settings β†’ Applications β†’ ULPI
    • If β€œPending approval” β†’ Ask org admin to approve
  2. Request org admin approval:
    • Send to admin: github.com/orgs/YOUR_ORG/settings/oauth_application_policy
    • Admin: Find β€œULPI Documentation”
    • Admin: Click β€œGrant access”
  3. Verify you have access:
    • You must have Read access to repository
    • Check: github.com/YOUR_ORG/REPO/settings/access
Still not working?
  • Try disconnecting and reconnecting repository
  • Verify OAuth token has correct scopes
  • Contact support: support@ulpi.io
Symptom: Status shows β€œWebhook: Inactive βŒβ€Impact:
  • Docs are searchable (current version)
  • New changes WON’T auto-update
  • Must manually re-index after each push
Common causes:1. Insufficient permissions:
  • Need admin or write access
  • Fix: Ask repo admin to grant access
2. Firewall blocking:
  • Corporate firewall blocks api.ulpi.io
  • Fix: Whitelist *.ulpi.io in firewall
3. Webhook manually deleted:
  • Someone removed webhook from GitHub
  • Fix: Reconnect repository to re-register
4. GitHub Enterprise behind VPN:
  • ULPI can’t reach your server
  • Fix: Enterprise plan with VPN peering
Manual setup:
  • See β€œManual Webhook Setup” tab above
  • Requires admin access to repository
Workaround:
  • Use manual re-index after each push
  • Not ideal, but works if webhooks can’t be enabled

Best Practices for Documentation

Optimize your repositories for better search:

πŸ“ Standard Directory Structure

Recommended structure:
your-repo/
β”œβ”€β”€ README.md              # Quick start
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ getting-started.md # Setup guide
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”œβ”€β”€ authentication.md
β”‚   β”‚   └── endpoints.md
β”‚   β”œβ”€β”€ guides/
β”‚   β”‚   β”œβ”€β”€ deployment.md
β”‚   β”‚   └── troubleshooting.md
β”‚   └── architecture/
β”‚       β”œβ”€β”€ decisions/     # ADRs
β”‚       └── diagrams/
β”œβ”€β”€ CONTRIBUTING.md
└── .ulpiignore
Why this works:
  • Easy to find docs (always /docs)
  • Logical organization by topic
  • ULPI indexes everything

πŸ“ Clear, Descriptive Filenames

Good filenames:
  • βœ… authentication-guide.md
  • βœ… deployment-to-aws.md
  • βœ… troubleshooting-500-errors.md
  • βœ… api-rate-limiting.md
Bad filenames:
  • ❌ doc1.md
  • ❌ notes.md
  • ❌ stuff.md
  • ❌ temp.md
Impact on search:
  • Filenames are used in ranking
  • Descriptive names = better results

πŸ”„ Update Docs with Code

Document in the same PR:
PR #247: Add OAuth 2.0 authentication

Changed files:
βœ… src/auth/oauth.js          (code)
βœ… docs/authentication.md     (docs)
βœ… README.md                  (updated)
Benefits:
  • Docs never get stale
  • Reviewers catch doc issues
  • Webhooks auto-index on merge
  • AI sees updated docs instantly

πŸ“‘ Use Headings & Structure

Well-structured docs:
# Authentication Guide

## Overview
Brief intro...

## Quick Start
Step-by-step...

## OAuth 2.0
### Setup
### Token Refresh
### Error Handling

## Troubleshooting
### Common Errors
### Debug Tips
Why:
  • Semantic search uses headings
  • Chunking respects sections
  • Better result snippets

Documentation Quality Tips

New developers need:
  • Clear setup instructions
  • Prerequisites listed
  • Step-by-step guides
  • Screenshots/diagrams
Experienced developers need:
  • API references
  • Architecture decisions
  • Performance tuning
  • Troubleshooting guides
Write both types:
  • getting-started.md for newbies
  • architecture/decisions/ for veterans
Strategies:
  1. Review quarterly:
    • Set calendar reminder
    • Read through all docs
    • Update outdated info
  2. Version indicators:
    > **Version:** v2.0
    > **Last updated:** 2025-01-15
    > **Deprecated:** v1.0 docs moved to archive/
    
  3. Archive old docs:
    docs/
    β”œβ”€β”€ current/         # Latest docs
    └── archive/
        β”œβ”€β”€ v1.x/
        └── deprecated/
    
    Add to .ulpiignore:
    /docs/archive/
    
  4. Changelog: Track doc changes in docs/CHANGELOG.md

Next Steps


Need help with repositories?Average response time: Under 2 hours during business hoursEnterprise support: Dedicated Slack channel + priority response