For property platforms
Drop-in screening API for your existing PMS or leasing app. Multi-tenant from day one, scoped API keys per integration, webhooks for status changes.
REST integration →AI-powered pet screening — log in and your assistant is ready to brief you on what needs attention. A self-hostable screening backend with a first-class REST API and native MCP support, audit-grade by design, opinionated about Fair Housing compliance, and built so an agent can drive the entire workflow without any custom integration glue.
Pet screening sits in the regulated path between a leasing decision and a tenant. Owning the system that makes those decisions matters — for compliance review, for cost, and for product flexibility.
Run LeashPass on your own infra. Your tenant data, your audit trail, your pricing. No per-screening fees, no usage limits, no vendor that can change terms next quarter.
The scoring rubric is published YAML in this repo. Every state change writes an audit event. Auditors can read the code that made a decision — not a black-box score.
Fork the rubric. Embed the API in your existing PMS. Extend the schema with property-specific fields. The point of open source is that it bends to your shape.
MCP — the Model Context Protocol — lets an LLM call your APIs as tools, with structured input schemas and rich descriptions written for AI consumption. LeashPass ships an MCP server alongside its REST API so agents can drive the whole screening workflow directly.
Every endpoint is built for non-human callers:
# MCP tool call from a Claude session
tool: transition_profile
input:
profile_id: "petprof_01HG3K..."
to_status: "approved"
note: "vaccinations current; no incidents"
# Result — structured, idempotent, audit-logged
result:
status: "approved"
reviewed_at: "2025-01-14T17:42:31Z"
reviewed_by: "user_01HG2X..."
LeashPass is a single Go binary with embedded migrations and templates. Run it on your laptop with SQLite, run it on a $5 VPS with Postgres, or run it in Kubernetes behind your existing ingress. No background workers, no Redis, no message queue required for the v0.1 surface.
$ docker run -p 8080:8080 ghcr.io/leashpass/leashpass:latest
$ curl -X POST http://localhost:8080/bootstrap \
-d '{"email":"you@example.com"}'
Deploys cleanly to Fly.io, Hetzner, AWS, GCP, or a Raspberry Pi in your basement. Self-hosting is the default, not an afterthought.
Pet screening intersects Fair Housing law and assistance-animal accommodation. Most tools in this space hide their decision logic behind opaque scores. LeashPass takes the opposite position.
LeashPass does not provide legal advice. Compliance with FHA/HUD and your local ordinances is your responsibility — but the data model is built so that producing evidence on demand is straightforward.
Every submitted profile gets a 1–5 LP-Score with an action label — "Approve", "Review", "Decline" — computed from a published YAML rubric. No black box.
Read the rubric: v0.1.0.yaml on GitHub .
Drop-in screening API for your existing PMS or leasing app. Multi-tenant from day one, scoped API keys per integration, webhooks for status changes.
REST integration →Connect Claude, GPT, or any MCP-compatible client to a real screening backend. Agents drive the workflow; on-behalf-of headers preserve human accountability.
MCP server →One binary, your data, no SaaS dependency. Run it on a Pi for a single property, or behind your existing ingress for a portfolio of thousands.
Self-host guide →An honest accounting of what ships in the binary you can run right now — and what is in active development.
/chat immediately after sign-in. A Claude Sonnet assistant auto-fires a personalized briefing within seconds: who you are, what you can access, the 2–3 highest-priority items in your queue, and a concrete next action. Same tool catalog the MCP server exposes, scope-filtered per role. Streaming SSE, inline tool-call pills, full audit trail. No browser extension or external client needed./admin/site-settings, hit save, the next chat turn reflects the change. Every save is audited with a before/after diff.permission_denied response carries the reason, who can act, and concrete alternatives — so the chat agent surfaces the truth (“Diane isn’t assigned to Acme West”) instead of inventing a technical-sounding excuse. Operator-only /admin/permission-audit page lists historical writes by managers at properties they aren’t currently assigned to.attach_document_to_profile tool. Same 10 MB / PDF · JPEG · PNG · HEIC validation as the REST surface, with a 24-hour TTL on staged-but-unattached uploads and a per-hour janitor sweep. Closes the needs-info loop entirely in chat: manager says “please upload current rabies vaccination,” resident drops the file, agent attaches it, resident says “done,” agent resubmits the profile in a single tool call.transition_profile and report success. It calls preview_transition_profile first; the chat renders a vertical canonical pipeline showing each milestone (Submitted → Under Review → optionally Needs Info if the profile ever entered it → the proposed terminal step) with a green ✓ for completed steps, a filled blue dot for the current step, and a dashed-border arrow for the proposed step (red-tinted when destructive and terminal). Each completed step shows the date it was reached and who acted; needs_info shows entry and resolution dates plus a brief synthesised resolution context. Then a Confirm button. Only on Confirm does the action fire. Same flow for outbound emails: the agent drafts via preview_notification, the chat renders the message as an email card with the rendered subject + body, the manager clicks Send. The contract is enforced server-side — an agent that skips the preview gets a structured permission_denied with reason=preview_required and no profile state changes / no emails send. Every confirmed action's audit row carries the originating preview_id so six-months-later forensic queries can reconstruct exactly what the manager saw before each terminal decision.get_profile_workflow is the read-only sibling of the preview tools. Same vertical pipeline widget the destructive-action flow renders, just without a Confirm button. Active profiles show the current step as a filled blue dot; terminal profiles (approved, rejected) show the terminal step as a completed green ✓. Permission gate stricter than the existing read: only admin / property-assigned manager / resident-on-profile / operator-with-pin can render a profile's workflow — a structured permission_denied response carries alternatives naming people who CAN view it, so the agent's failure narrative is honest rather than masked as NotFound.🔍 under_review upgrade to colored pills automatically. All components share a unified LeashPass design-token system; see docs/styling.md.list_review_queue returns the caller's scoped queue with per-row urgency tiers and write-permission flags, get_priority_item returns the single highest-priority lead (with a friendly “queue clear” positive callout when nothing's waiting), and get_profile_summary returns the highlights / concerns card derived directly from screening fields (no LLM inference — bullets always match reality). The chat handler detects each tool by name and wraps the JSON response in the same fenced widget block format the Phase 2.3 patterns use; the frontend renderer stays unchanged. The LLM’s instructions become simpler too — one rule per visual (“call this tool”) instead of a JSON-shape spec the LLM had to author correctly under streaming pressure. Same visual outcome as Phase 2.3, far fewer failure modes (wrong tag spelling, empty payloads, info-string variants, streaming flicker — all gone). The defensive LLM-emit path stays in place so historical conversations render unchanged.
Version v0.1 is a working backend you can run and integrate against today.
It is not yet recommended as the sole system of record for production leasing
decisions — check the repo
for current status.
Pet screening sits in a regulated decisioning path. The choice was either to build a closed system the operator can't audit, or an open one anyone can read, fork, and verify. The second option scales better and ages better.
v0.1 is a working backend with full tenancy, RBAC, the screening workflow, document upload, the LP-Score engine, and the MCP server. It's appropriate for pilots and small portfolios. For larger production use, the operational envelope (HA Postgres, observability, on-call playbook) is still being filled in — check the status board on GitHub for current state.
No. The scoring engine is rule-based and deterministic. LLM integration is optional — the MCP server lets agents drive the workflow if you want it, but every endpoint also works as plain REST.
LP-Score is a deterministic, rule-based engine over a published YAML rubric
(internal/scoring/rubric/v0.1.0.yaml). Eleven weighted criteria
sum to 100 points; the percentage maps to a 1–5 score with an
action label (Approve / Review / Decline).
Honest answer on accuracy: the score reflects what the resident attests, not what we can verify. There's no OCR, no breed-detection ML, no behavioral inference. It's a triage signal designed to surface profiles that warrant a closer look — not a substitute for documentation review or manager judgment. The "right" score is the one a manager can defend by pointing to the rubric and the resident's answers, not one optimized against a hidden ground truth we don't have.
Service animals and emotional support animals bypass scoring entirely per the FHA. Breed is not an input.
The data model and audit trail are designed to make compliance evidence straightforward to produce. Breed-based scoring is explicitly excluded. Service-animal accommodation requests follow a separate review path. LeashPass does not provide legal advice — talk to your counsel before going live.
Yes. SQLite for dev, Postgres on a single VPS for production. No required third-party services. Email and file storage have console-mode fallbacks for local development.
The operator runs the LeashPass instance — one person (or team) deploying the binary on their infra. Operators are instance-wide superusers with no organization of their own.
Each customer is a separate organization on that same instance, with its own admins, managers, and residents. An admin can only see and act on data inside their organization; a manager only sees their assigned properties.
One LeashPass instance, one operator, multiple organizations — the right shape if you're a property-management group hosting screening for several portfolios you operate, or a platform offering it to multiple clients.
Three ways: scoped API keys for direct REST calls, MCP server for agents, and webhooks for event notifications. The OpenAPI spec ships when the API surface stabilizes in Phase 1c.
Use GitHub's private vulnerability reporting on the repo, or follow the policy in SECURITY.md. Please do not open public issues for vulnerabilities.
LeashPass is an open project — all contributors are listed on the contributors page. Bug reports, feature requests, and pull requests welcome.
Single-command Docker run, sample data, working REST API, working web UI. Kick the tires before reading any more docs.