RepoPilotOpen in app →

gofr-dev/gofr

An opinionated GoLang framework for accelerated microservice development. Built in support for databases and observability.

Healthy

Healthy across the board

Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 1d ago
  • 10 active contributors
  • Distributed ownership (top contributor 49% of recent commits)
Show 3 more →
  • Apache-2.0 licensed
  • CI configured
  • Tests present

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/gofr-dev/gofr)](https://repopilot.app/r/gofr-dev/gofr)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/gofr-dev/gofr on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: gofr-dev/gofr

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/gofr-dev/gofr shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

GO — Healthy across the board

  • Last commit 1d ago
  • 10 active contributors
  • Distributed ownership (top contributor 49% of recent commits)
  • Apache-2.0 licensed
  • CI configured
  • Tests present

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live gofr-dev/gofr repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/gofr-dev/gofr.

What it runs against: a local clone of gofr-dev/gofr — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in gofr-dev/gofr | Confirms the artifact applies here, not a fork | | 2 | License is still Apache-2.0 | Catches relicense before you depend on it | | 3 | Default branch development exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 31 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>gofr-dev/gofr</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of gofr-dev/gofr. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/gofr-dev/gofr.git
#   cd gofr
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of gofr-dev/gofr and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "gofr-dev/gofr(\\.git)?\\b" \\
  && ok "origin remote is gofr-dev/gofr" \\
  || miss "origin remote is not gofr-dev/gofr (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is Apache-2.0" \\
  || miss "license drift — was Apache-2.0 at generation time"

# 3. Default branch
git rev-parse --verify development >/dev/null 2>&1 \\
  && ok "default branch development exists" \\
  || miss "default branch development no longer exists"

# 4. Critical files exist
test -f "README.md" \\
  && ok "README.md" \\
  || miss "missing critical file: README.md"
test -f ".github/workflows/go.yml" \\
  && ok ".github/workflows/go.yml" \\
  || miss "missing critical file: .github/workflows/go.yml"
test -f ".golangci.yml" \\
  && ok ".golangci.yml" \\
  || miss "missing critical file: .golangci.yml"
test -f "CONTRIBUTING.md" \\
  && ok "CONTRIBUTING.md" \\
  || miss "missing critical file: CONTRIBUTING.md"
test -f "CODE_OF_CONDUCT.md" \\
  && ok "CODE_OF_CONDUCT.md" \\
  || miss "missing critical file: CODE_OF_CONDUCT.md"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 31 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~1d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/gofr-dev/gofr"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

GoFr is an opinionated Go microservice framework that bundles HTTP/gRPC routing, database abstraction, observability (logs, traces, metrics), and deployment tooling into a single cohesive SDK. It solves the problem of building Kubernetes-ready microservices without writing boilerplate for observability, health checks, migrations, and configuration management. Monorepo structure: core framework logic lives in the gofr.dev module, modular datasource packages under gofr.dev/pkg/gofr/datasource/* (file/ftp, SQL, gRPC), and example projects (examples/using-add-filestore) demonstrate usage. Docs are static site sources in docs/advanced-guide with topic-specific page.md files. CI workflows in .github/workflows handle Go testing, typo checks, and website staging/prod deployment.

👥Who it's for

Go backend developers and platform engineers building microservices destined for Kubernetes clusters who need out-of-the-box observability, database connectivity, and REST/gRPC standards without repetitive scaffolding.

🌱Maturity & risk

Production-ready and actively maintained. The repo shows ~3.2MB of Go code, comprehensive CI/CD via .github/workflows/go.yml, Dockerfile support, and structured documentation in docs/advanced-guide. Version v1.56.4 visible in go.mod indicates stable versioning. Code quality tracked via .codeclimate.yml and .qlty configuration suggest ongoing quality enforcement.

Low risk: the project maintains strict linting (.golangci.yml, .ls-lint.yml), has multiple example projects in the repo, and integrates with external quality monitoring (qlty.sh, Code Coverage badges). Dependency footprint is moderate but explicit (cloud.google.com, gRPC ecosystem packages, Prometheus). No single-maintainer risk visible given organizational GitHub structure (gofr-dev).

Active areas of work

Framework is actively developed with v1.56.4 as the latest version. Dependabot configured (.github/dependabot.yml) for automatic dependency updates. Documentation is being actively maintained with advanced guides covering circuit breakers, gRPC streaming, authentication, GraphQL, file handling, and migrations. Website deployment pipelines (website-stage.yml, website-prod.yml) indicate continuous docs updates.

🚀Get running

Clone the repo with git clone https://github.com/gofr-dev/gofr.git && cd gofr. Install dependencies with go mod download. Run tests with go test ./... (inferred from go.yml workflow). Start exploring examples/ for runnable microservice samples, or review docs/quick-start/ for getting-started guides.

Daily commands: No single 'dev server' as this is a framework library. To run examples: cd examples/using-add-filestore && go run main.go. To validate the framework itself: go test ./... runs all tests. Docker support via Dockerfile for containerized deployment.

🗺️Map of the codebase

  • README.md — Entry point documenting GoFr as an opinionated microservice framework with built-in database and observability support—essential for understanding project scope and philosophy.
  • .github/workflows/go.yml — CI/CD pipeline defining build, test, and deployment automation—critical for understanding how contributions are validated.
  • .golangci.yml — Linting configuration enforcing code quality standards across the codebase—contributors must comply with these rules.
  • CONTRIBUTING.md — Contributor guidelines outlining development workflow, PR process, and coding standards specific to this project.
  • CODE_OF_CONDUCT.md — Community standards and behavioral expectations for all contributors and maintainers.
  • docs/datasources/getting-started/page.md — Documentation for the framework's core datasource abstraction layer—essential for understanding how databases and external services integrate.
  • Dockerfile — Container build configuration showing how the framework is packaged and deployed in production environments.

🧩Components & responsibilities

  • HTTP Handler & Router (Go net/http) — Maps incoming HTTP requests to handler functions, manages route registration and middleware binding
    • Failure mode: Request routing failures result in 404 or 500 errors; uncaught panics crash handler goroutine
  • Middleware Stack (HTTP middleware pattern) — Chainable pre/post-processors for cross-cutting concerns (auth, logging, CORS)
    • Failure mode: Middleware errors can halt request processing; poor ordering causes incorrect behavior
  • Datasource Abstraction Layer (Driver-based pattern) — Unified interface for multiple database/cache systems with connection pooling and health checks

🛠️How to make changes

Add Support for a New Datasource

  1. Create a new documentation page following the pattern in docs/datasources/ directory, mirroring the structure of existing datasources like docs/datasources/elasticsearch/page.md (docs/datasources/{datasource-name}/page.md)
  2. Add configuration examples and connection patterns in the datasource documentation (docs/datasources/{datasource-name}/page.md)
  3. Reference the new datasource in docs/datasources/getting-started/page.md to include it in the main datasource guide (docs/datasources/getting-started/page.md)
  4. Update the main README.md to list the newly supported datasource in the features section (README.md)

Document a New Advanced Feature

  1. Create a new markdown page in docs/advanced-guide/{feature-name}/page.md following existing patterns like docs/advanced-guide/middlewares/page.md (docs/advanced-guide/{feature-name}/page.md)
  2. Include code examples, usage patterns, and best practices for the feature (docs/advanced-guide/{feature-name}/page.md)
  3. Add cross-references to related features (e.g., if documenting authentication, reference RBAC documentation) (docs/advanced-guide/{feature-name}/page.md)

Add a Framework Comparison

  1. Create a comparison document at docs/comparison/gofr-vs-{framework}/page.md mirroring the structure of existing comparisons like docs/comparison/gofr-vs-gin/page.md (docs/comparison/gofr-vs-{framework}/page.md)
  2. Document feature parity, performance characteristics, and use-case suitability (docs/comparison/gofr-vs-{framework}/page.md)
  3. Update docs/comparison/page.md to list the new comparison (docs/comparison/page.md)

🔧Why these technologies

  • Go 1.25.0 — Statically typed, compiled language with excellent concurrency primitives (goroutines) and minimal runtime overhead—ideal for high-performance microservices.
  • Multiple datasource adapters (SQL, NoSQL, search) — Abstraction layer supporting diverse persistence patterns (relational, document, graph, search engines) without vendor lock-in.
  • Built-in observability (tracing, metrics, logging) — Framework-level instrumentation eliminates boilerplate and ensures consistent observability across all services built with GoFr.
  • gRPC, GraphQL, WebSocket support — Opinionated support for multiple communication protocols beyond REST, enabling flexible service-to-service and client-server patterns.

⚖️Trade-offs already made

  • Opinionated framework design (vs. minimal router libraries like Chi or Gin)

    • Why: Balances developer productivity with standardization; reduces decision fatigue and enables best practices out-of-the-box.
    • Consequence: Less flexibility for projects requiring highly custom patterns; steeper learning curve for developers unfamiliar with the framework's conventions.
  • Built-in database abstraction layer requiring datasource drivers

    • Why: Centralizes connection pooling, migration handling, and observability instrumentation at the framework level.
    • Consequence: Dependency on driver implementations; adds a layer between application and raw database APIs, with potential performance cost for edge cases requiring direct access.
  • Framework-level observability with OpenTelemetry integration

    • Why: Eliminates manual instrumentation boilerplate and ensures consistent tracing/metrics across all services.
    • Consequence: Some observability overhead in every request; less control over granular tracing decisions for specialized use cases.

🚫Non-goals (don't propose these)

  • Frontend UI framework—GoFr is backend-only (though static file serving is supported via docs/advanced-guide/serving-static-files/page.md).
  • Real-time collaborative editing—while WebSocket support exists, the framework is optimized for request-response and event-driven patterns, not continuous synchronization.
  • Mobile development—Go/GoFr is purely for backend/server development.
  • Cross-platform package management—relies on Go module ecosystem; no language bindings or polyglot support.

🪤Traps & gotchas

  1. Framework expects Go 1.25+; older versions will fail mod resolution. 2) Database health checks assume specific driver conventions (SQL, Redis, etc.); custom datasources must implement the health check interface. 3) Observability is auto-wired but requires valid OpenTelemetry collector endpoints (OTEL_EXPORTER_OTLP_ENDPOINT env var) to avoid graceful degradation—missing this doesn't error but metrics/traces silently drop. 4) File/FTP datasource examples require .ssh/config or FTP credentials; local testing needs fixtures or mocks. 5) gRPC examples assume proto files are pre-compiled; no codegen automation visible in examples.

🏗️Architecture

💡Concepts to learn

  • Circuit Breaker Pattern — GoFr's HTTP service client (docs/advanced-guide/http-communication) includes built-in circuit breaker support to prevent cascading failures when calling downstream services
  • OpenTelemetry Instrumentation — GoFr auto-instruments SQL queries, HTTP calls, and gRPC handlers with OTel; understanding spans, traces, and exporters is essential for production observability
  • Dependency Injection via Context — GoFr uses context structs (visible in middleware and handler patterns) to inject datasources, config, and logger; this pattern avoids global state and enables testability
  • Database Migration Versioning — GoFr provides database migration tooling (docs/advanced-guide/handling-data-migrations); understanding migration state tracking prevents deployment bugs
  • gRPC Middleware and Streaming — GoFr integrates grpc-ecosystem middleware and supports bidirectional streaming (docs/advanced-guide/grpc-streaming); critical for inter-service communication patterns
  • Health Check Abstraction — GoFr auto-aggregates health checks across all datasources (SQL, Redis, file, etc.) for Kubernetes readiness probes; understanding how this works prevents false negatives
  • Pub/Sub Abstraction Layer — GoFr abstracts over multiple message brokers (docs/advanced-guide/using-publisher-subscriber); the interface pattern enables swapping implementations without code changes
  • gin-gonic/gin — Popular Go HTTP framework; GoFr differentiates with integrated observability and datasource management rather than pure routing
  • go-kit/kit — Microservice toolkit with middleware and service patterns; GoFr is more opinionated and batteries-included whereas go-kit is modular
  • grpc/grpc-go — Core gRPC implementation; GoFr wraps this with middleware, health checks, and observability integration
  • open-telemetry/opentelemetry-go — Observability foundation; GoFr integrates this for automatic logging, tracing, and metrics collection
  • gofr-dev/gofr-examples — Official companion repository (if it exists) with runnable microservice examples and integration tests

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add missing documentation for RBAC and Authentication integration

The file structure shows docs/advanced-guide/rbac/page.md and docs/advanced-guide/authentication/page.md exist, but these are critical security features. A contributor could expand these with concrete examples showing how to integrate RBAC with different auth providers, add code samples for JWT validation, and document common pitfalls. This is high-value because security misconfiguration is a common source of production issues.

  • [ ] Review docs/advanced-guide/rbac/page.md and docs/advanced-guide/authentication/page.md to identify gaps
  • [ ] Add code examples for role-based access control patterns with middleware integration
  • [ ] Document JWT validation strategies and token refresh flows
  • [ ] Add examples for integrating with OAuth2/OIDC providers mentioned in go.mod (golang-jwt/jwt/v5)
  • [ ] Include common security anti-patterns to avoid
  • [ ] Add a troubleshooting section for authentication failures

Add integration tests for gRPC streaming with observability

The file structure shows docs/advanced-guide/grpc-streaming/page.md and docs/advanced-guide/custom-spans-in-tracing/page.md exist, but there's no dedicated integration test file visible for gRPC streaming with tracing enabled. Given the framework's built-in observability support and gRPC as a core feature, adding comprehensive integration tests would catch regressions and provide templates for users.

  • [ ] Create integration test file: tests/integration/grpc_streaming_test.go (or appropriate path)
  • [ ] Test unary RPC calls with trace spans using XSAM/otelsql
  • [ ] Test server streaming with proper span propagation
  • [ ] Test client streaming with context cancellation and span cleanup
  • [ ] Test bidirectional streaming with concurrent requests and trace correlation
  • [ ] Verify traces are exported correctly with cloud.google.com/go/pubsub integration
  • [ ] Add test utilities for asserting span attributes and relationships

Add documentation and examples for file handling with FTP datasource

go.mod shows gofr.dev/pkg/gofr/datasource/file/ftp v0.2.2 is a dependency, and docs/advanced-guide/handling-file/page.md exists, but the current documentation likely lacks FTP-specific examples. Adding concrete examples for FTP operations (upload, download, list, delete) with error handling would help users leverage this datasource effectively.

  • [ ] Review docs/advanced-guide/handling-file/page.md to identify FTP coverage gaps
  • [ ] Add FTP-specific configuration examples (host, port, credentials, timeout)
  • [ ] Create code examples for: uploading files, downloading files, listing directories, deleting files
  • [ ] Document FTP connection pooling and reconnection strategies
  • [ ] Add error handling patterns for common FTP failures (connection timeout, authentication, file not found)
  • [ ] Include an example showing FTP file operations within a microservice handler
  • [ ] Add security best practices for FTP credentials management (environment variables, secrets)

🌿Good first issues

  • Add comprehensive example for custom middleware in examples/ showing logging, auth, and error handling stacks; currently docs/advanced-guide/authentication/ covers basics but no full runnable example exists
  • Expand docs/advanced-guide/debugging/page.md with concrete pprof CPU/memory profiling examples and Dockerfile multi-stage build best practices for production observability
  • Create integration tests in examples/ for pub/sub using mock brokers (Kafka, Redis) to validate publisher/subscriber patterns against documented API in docs/advanced-guide/

Top contributors

Click to expand

📝Recent commits

Click to expand
  • a972528 — Merge pull request #3102 from akshat-kumar-singhal/development (Umang01-hash)
  • a9f15bf — Merge branch 'development' into development (Umang01-hash)
  • 370227d — Merge pull request #3368 from NitinKumar004/fix/grpc-shutdown-nil-panic (Umang01-hash)
  • f7aa5f9 — Merge branch 'development' into fix/grpc-shutdown-nil-panic (Umang01-hash)
  • 3bbf44b — ci(website): build source-bundle to --target builder (#3397) (aryanmehrotra)
  • 5f14428 — docs: cross-link audit + staging-review fixes (#3395) (aryanmehrotra)
  • 6b0d44a — Merge branch 'development' into fix/grpc-shutdown-nil-panic (NitinKumar004)
  • c8b1f70 — Merge pull request #3393 from gofr-dev/deps/minor-updates-2026-05-05 (Umang01-hash)
  • 2b22983 — Merge branch 'development' into fix/grpc-shutdown-nil-panic (aryanmehrotra)
  • cb8c67b — chore(deps): regenerate arangodb Client mock for go-driver/v2 v2.3.0 (Umang01-hash)

🔒Security observations

  • High · Inadequate Vulnerability Reporting Process — SECURITY.md. The SECURITY.md file indicates vulnerabilities should be reported by filing a public issue with a 'security' label. This is not a secure disclosure process as it exposes vulnerability details publicly before patches are available, potentially allowing attackers to exploit the issue. Fix: Implement a responsible disclosure process using GitHub's Security Advisory feature or a private security contact (e.g., security@gofr.dev). Use GitHub's 'Report a vulnerability' button and provide a private communication channel for security researchers.
  • High · Only Version 1.0.x Supported for Security Updates — SECURITY.md. The security policy only supports version 1.0.x, while the go.mod indicates the framework is at v1.56.4. This suggests a significant gap in security support coverage for current versions, leaving most deployments potentially unpatched. Fix: Establish a clear security support policy covering recent major/minor versions (typically last 2-3 versions). Update the supported versions table to reflect current maintenance practices and communicate deprecation timelines.
  • High · Multi-stage Docker Build Exposes Build Context — Dockerfile. The Dockerfile uses 'COPY . .' which includes the entire repository context in the build layer, potentially exposing sensitive configuration files, private keys, or internal documentation before the multi-stage optimization removes them. Fix: Use a .dockerignore file to explicitly exclude sensitive files (secrets, .env files, private documentation). Consider using BuildKit with secrets mounting for sensitive data instead of copying directly.
  • Medium · Alpine Base Image Without Explicit Version Pinning — Dockerfile. The Dockerfile uses 'alpine:latest' in the runtime stage, which can introduce unpredictable updates and potential incompatibilities. Latest tags are not pinned to specific security patches. Fix: Pin the Alpine version to a specific release (e.g., 'alpine:3.20' or 'alpine:3.20.3'). Regularly update and test against new Alpine versions in a controlled manner.
  • Medium · No Security Scanning in CI/CD Pipeline — .github/workflows/go.yml. The GitHub workflows (.github/workflows/go.yml) appear to lack automated security scanning (SAST, dependency checking, container scanning). No evidence of tools like gosec, go-vuln, or Dependabot integration for runtime scanning. Fix: Integrate security scanning tools: 1) Add gosec for Go security issues, 2) Enable Dependabot alerts for Go dependencies, 3) Consider container image scanning with tools like Trivy, 4) Add SAST scanning in CI pipeline.
  • Medium · Large Transitive Dependency Graph — go.mod (partial view shown). The project has a substantial dependency tree including cloud.google.com, gRPC ecosystem, GraphQL, and database drivers. Large dependency trees increase attack surface and supply chain risks. Fix: Regularly audit and minimize dependencies. Use 'go mod tidy' to remove unused dependencies. Implement dependency scanning with 'go mod vulnerabilities' and use tools like 'govulncheck' to identify known vulnerabilities in the dependency tree.
  • Medium · No Evidence of Input Validation Patterns — docs/advanced-guide/ (entire directory - SQL, GraphQL, file handling sections). Given the framework supports HTTP servers, GraphQL, gRPC, and databases, there's a risk of injection attacks (SQLi, XSS) if the framework documentation and examples don't emphasize secure coding patterns. Fix: Ensure comprehensive security documentation covering: 1) Parameterized queries for SQL, 2) Input validation and sanitization patterns, 3) CORS and CSRF protections, 4) XSS prevention for web endpoints, 5) File upload security for file handling.
  • Low · Exposed Port 8000 Without Documentation — Dockerfile. The Dockerfile exposes port 8000 without documented security considerations or TLS/HTTPS enforcement guidance for production deployments. Fix: Document security best practices for production: 1) Enforce HTTPS/TLS for all production deployments, 2) Provide examples of reverse proxy configuration (nginx/HAProxy), 3) Document how to change ports securely, 4) Add security headers middleware examples

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · gofr-dev/gofr — RepoPilot