RepoPilotOpen in app →

ipkn/crow

Crow is very fast and easy to use C++ micro web framework (inspired by Python Flask)

Healthy

Healthy across all four use cases

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.

  • 21+ active contributors
  • Distributed ownership (top contributor 48% of recent commits)
  • BSD-3-Clause licensed
Show 3 more →
  • CI configured
  • Tests present
  • Stale — last commit 2y ago

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/ipkn/crow)](https://repopilot.app/r/ipkn/crow)

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/ipkn/crow on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: ipkn/crow

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/ipkn/crow 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 all four use cases

  • 21+ active contributors
  • Distributed ownership (top contributor 48% of recent commits)
  • BSD-3-Clause licensed
  • CI configured
  • Tests present
  • ⚠ Stale — last commit 2y ago

<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 ipkn/crow repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/ipkn/crow.

What it runs against: a local clone of ipkn/crow — 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 ipkn/crow | Confirms the artifact applies here, not a fork | | 2 | License is still BSD-3-Clause | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 732 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>ipkn/crow</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of ipkn/crow. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/ipkn/crow.git
#   cd crow
#
# 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 ipkn/crow and re-run."
  exit 2
fi

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

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

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

# 4. Critical files exist
test -f "include/crow.h" \\
  && ok "include/crow.h" \\
  || miss "missing critical file: include/crow.h"
test -f "include/crow/app.h" \\
  && ok "include/crow/app.h" \\
  || miss "missing critical file: include/crow/app.h"
test -f "include/crow/routing.h" \\
  && ok "include/crow/routing.h" \\
  || miss "missing critical file: include/crow/routing.h"
test -f "include/crow/http_connection.h" \\
  && ok "include/crow/http_connection.h" \\
  || miss "missing critical file: include/crow/http_connection.h"
test -f "include/crow/http_server.h" \\
  && ok "include/crow/http_server.h" \\
  || miss "missing critical file: include/crow/http_server.h"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 732 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~702d)"
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/ipkn/crow"
  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

Crow is a header-only C++ microframework for building REST web applications, inspired by Python Flask. It provides type-safe routing with compile-time handler validation, built-in JSON parsing (crow::json), Mustache templating, WebSocket support, and middleware capabilities—benchmarked to be significantly faster than competing C++ web frameworks. Single-header architecture: include/crow.h is the entry point, pulling in modular headers from include/crow/ (routing.h, http_connection.h, json.h, websocket.h, middleware.h, etc.). Examples in examples/ demonstrate patterns (helloworld.cpp, example_chat.cpp, example_ssl.cpp). Tests under tests/ with template-based test suite. Amalgamation script (amalgamate/merge_all.py) generates single crow_all.h distribution file.

👥Who it's for

C++ developers building high-performance REST APIs and microservices who want Flask-like simplicity without Python's runtime overhead. Specifically targets systems engineers and performance-critical applications where sub-millisecond response times matter.

🌱Maturity & risk

This repository is abandoned and no longer maintained (README explicitly states 'NOT MAINTAINED ANYMORE'). The canonical fork has moved to CrowCpp/Crow. While the original codebase has Travis CI/coverage badges and includes examples, the master branch receives no active development. Risk: use the CrowCpp/Crow fork instead for security patches and bug fixes.

Critical risk: This repository is unmaintained. While header-only libraries have fewer dependency issues, there are no recent security audits, no active issue triage, and no guaranteed compatibility with modern C++ standards or compiler versions. The project has single-maintainer risk (ipkn) with no succession plan visible. Boost dependency adds transitive risk; tcmalloc/jemalloc are optional but recommended.

Active areas of work

This repository is dormant. No active development visible. The README redirects users to CrowCpp/Crow fork, which is the maintained continuation.

🚀Get running

git clone https://github.com/ipkn/crow.git
cd crow
mkdir build && cd build
cmake ..
make
./examples/helloworld
# Server runs on http://localhost:18080

Requires: C++11 compiler (g++>=4.8), CMake, Boost headers. See CMakeLists.txt and examples/CMakeLists.txt for exact configuration.

Daily commands:

cd build
cmake .. && make
./examples/helloworld
# Runs on :18080

# Or compile standalone:
g++ -I./include -std=c++11 examples/helloworld.cpp -o helloworld -pthread
./helloworld

🗺️Map of the codebase

  • include/crow.h — Main header file that includes all Crow components; the entry point for users of the framework
  • include/crow/app.h — Core application class (SimpleApp, App) that orchestrates routing, middleware, and server lifecycle
  • include/crow/routing.h — Route matching and handler dispatch engine; critical for request routing logic
  • include/crow/http_connection.h — HTTP connection handler managing per-client socket lifecycle and request/response sequencing
  • include/crow/http_server.h — Low-level server implementation handling socket binding, listening, and thread pool management
  • include/crow/json.h — Built-in JSON parser and serializer; fundamental for request/response data handling
  • include/crow/middleware.h — Middleware interface and context; enables request/response preprocessing and postprocessing

🛠️How to make changes

Add a new HTTP endpoint

  1. In your application code, use the CROW_ROUTE macro to define a new route handler (examples/example.cpp)
  2. Specify the HTTP method, path pattern, and optional path parameters in the macro (include/crow/app.h)
  3. Return an HTTP response using crow::response or a serializable object (automatic JSON) (include/crow/http_response.h)
  4. Access request data via the req parameter (headers, query params, body) (include/crow/http_request.h)
  5. Compile and link with Crow header files in include/crow/ (CMakeLists.txt)

Add custom middleware

  1. Create a struct inheriting from crow::middleware::middleware_api (include/crow/middleware.h)
  2. Implement before_handle and after_handle methods to intercept requests/responses (include/crow/middleware_context.h)
  3. Use app.get_middleware to access your middleware instance and modify context (include/crow/app.h)
  4. Register middleware on your app instance via app.get_middleware<YourMiddleware>() (examples/example.cpp)

Enable WebSocket support

  1. Define a WebSocket route using CROW_WEBSOCKET_ROUTE macro (examples/websocket/example_ws.cpp)
  2. Implement on_open, on_close, and on_message handlers in the lambda (include/crow/websocket.h)
  3. Use conn.send_message to broadcast or send data to clients (include/crow/websocket.h)
  4. Serve accompanying HTML with JavaScript WebSocket client (examples/websocket/templates/ws.html)

Parse and respond with JSON

  1. Access request body via req.body and parse using crow::json::load() (include/crow/json.h)
  2. Navigate parsed JSON using bracket notation or .o() for object access (include/crow/json.h)
  3. Create response objects using crow::json::wvalue to build JSON (include/crow/json.h)
  4. Return the JSON object directly from handler; Crow auto-serializes to response (include/crow/http_response.h)

🔧Why these technologies

  • Header-only C++ library — Simplifies deployment; users include headers directly with no build/link complexity
  • Multi-threaded async I/O with thread pool — Achieves high throughput without async/await syntax; each thread handles multiple connections via non-blocking sockets
  • Built-in JSON parser (crow::json) — Avoids external dependencies; provides fast incremental parsing suitable for streaming HTTP bodies
  • Mustache template engine — Enables server-side rendering of HTML without external template library; matches Flask's design philosophy
  • WebSocket support via socket adaptors — Enables bidirectional communication; abstraction layer supports plain TCP, SSL/TLS, and WebSocket upgrades

⚖️Trade-offs already made

  • Type-safe route parameters via C++ templates

    • Why: Compile-time safety catches parameter mismatches early
    • Consequence: Requires verbose template syntax and longer compile times; less dynamic than Python Flask
  • No built-in ORM or database abstraction

    • Why: Keeps framework lightweight and unopinionated about data layer
    • Consequence: Users must manually write SQL or use external libraries; more boilerplate than Django
  • Single-header routing via macros (CROW_ROUTE)

    • Why: Reduces boilerplate and makes routes discoverable in source code
    • Consequence: Macros can complicate IDE intellisense and debugging; less flexible than decorator-based registration
  • Thread-per-connection model with manual thread pool sizing

    • Why: Simple mental model; avoids callback-hell and event loop complexity
    • Consequence: Thread overhead may limit scalability on systems with thousands of concurrent connections vs. async I/O frameworks

🚫Non-goals (don't propose these)

  • Authentication/authorization (no built-in user session management)
  • Real-time pub/sub beyond Web

🪤Traps & gotchas

  1. Header-only gotcha: Changes to header files require full recompilation; no incremental builds across translation units. 2. Boost required at compile-time: Many headers include boost (asio, bind). If using amalgamated crow_all.h, Boost headers must still be in include path. 3. C++11 only: No C++14/17 features; very conservative. 4. Thread safety: SimpleApp single-threaded by default; .multithreaded() required for production (see example.cpp). 5. No request body streaming: Entire body buffered in memory (req.body is std::string). 6. Middleware execution order not documented: See middleware_context.h for ordering semantics. 7. Route parameter parsing: Integer types only validated; custom types require manual parsing.

🏗️Architecture

💡Concepts to learn

  • Type-Safe Route Handlers via Template Metaprogramming — Crow validates handler argument types against URL parameters at compile-time (see routing.h DynamicRule); mismatches produce compiler errors instead of runtime crashes. This is the core differentiator from string-based routing in Python frameworks.
  • Header-Only Library Design — All implementation in .h files means no separate compilation step; users just #include. Trades compilation time for deployment simplicity—critical for distributing crow_all.h as single amalgamated file.
  • HTTP Parser State Machine (bundled http_parser) — http_parser_merged.h is a zero-copy state machine from nodejs that incrementally parses streaming HTTP input without buffering full request. Understanding this is key to Crow's performance benchmark claims.
  • Middleware Chain / Request Context Propagation — middleware_context.h implements a stateful pipeline where each middleware can inspect/modify request before handler runs. Critical for cross-cutting concerns like auth, logging, CORS.
  • WebSocket Protocol Upgrade (RFC 6455) — websocket.h implements the HTTP Upgrade handshake and frame parsing for bidirectional communication. See example_chat.cpp for real usage; separate from REST request/response cycle.
  • Query String / Form Data Parsing (query_string.h) — ci_map.h provides case-insensitive header/query parameter lookups; query_string.h parses application/x-www-form-urlencoded into key-value maps. Needed for form-based APIs.
  • Mustache Template Rendering — mustache.h integrates the Mustache logic-less templating language for server-side HTML generation. See examples/example_chat.html for use case (rendering chat UI dynamically).
  • CrowCpp/Crow — The maintained fork of this abandoned project; use this instead for active development, security patches, and C++17+ support
  • uNetworking/uWebSockets — Alternative high-performance C++ WebSocket framework with lower latency; competitive microbenchmark comparison point
  • microsoft/cpprestsdk — Microsoft's C++ REST SDK offering type-safe routing and async patterns; heavier but more enterprise-focused than Crow
  • ipkn/crow-benchmark — Companion repo containing benchmark suite comparing Crow against Node.js/Go/Rust REST frameworks; referenced in Crow's performance claims
  • pallets/flask — The original Python Flask framework that inspired Crow's routing DSL and decorator-like CROW_ROUTE macro syntax

🪄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 comprehensive unit tests for websocket functionality in tests/unittest.cpp

The repo has websocket examples (examples/websocket/example_ws.cpp) but tests/unittest.cpp lacks dedicated websocket tests. Given that websocket is a core feature alongside HTTP routing, adding tests for connection lifecycle, message handling, and error cases would improve reliability and prevent regressions.

  • [ ] Add websocket connection establishment tests in tests/unittest.cpp
  • [ ] Add websocket message sending/receiving tests
  • [ ] Add websocket disconnection and error handling tests
  • [ ] Add tests for websocket with SSL (since examples/ssl/example_ssl.cpp exists)
  • [ ] Verify tests compile and pass with CMakeLists.txt

Add JSON request/response serialization tests in tests/unittest.cpp

The repo includes include/crow/json.h but there are no visible dedicated tests for JSON parsing, serialization, edge cases, or type safety. Since type-safe handlers are a core feature, comprehensive JSON tests would ensure robustness for common web API use cases.

  • [ ] Add tests for JSON parsing valid/invalid inputs in tests/unittest.cpp
  • [ ] Add tests for JSON serialization of various C++ types
  • [ ] Add tests for nested JSON object/array handling
  • [ ] Add tests for JSON error handling and validation
  • [ ] Add tests for JSON in HTTP request/response bodies

Add GitHub Actions CI workflow to replace Travis CI (which is deprecated)

The repo uses .travis.yml for CI, but Travis CI has transitioned to a paid model. The README already points to a maintained fork, but this original repo should have modern CI. Adding a GitHub Actions workflow (.github/workflows/build.yml) would provide free, native CI/CD with better GitHub integration.

  • [ ] Create .github/workflows/build.yml with matrix for multiple C++ standards (C++11, C++17)
  • [ ] Add build step using cmake and CMakeLists.txt
  • [ ] Add test execution step (tests/unittest.cpp via CTest)
  • [ ] Add compiler matrix (gcc, clang) to catch portability issues
  • [ ] Add coverage reporting step for coveralls integration

🌿Good first issues

  • Add integration tests for WebSocket upgrade path (websocket.h exists but tests/ has no ws_test.cpp). Create test harness using examples/websocket/ as reference.
  • Document middleware execution order and context cleanup in middleware.h and middleware_context.h with code examples. Currently no inline docs explain the callback flow.
  • Add CMake option to build with rapidjson/json11 instead of bundled parser. Currently only crow::json is easy; see README mention of alternatives but no build flag exists.

Top contributors

Click to expand
  • @ipkn — 48 commits
  • [@Javier Jerónimo Suárez](https://github.com/Javier Jerónimo Suárez) — 17 commits
  • [@Mark Meredith](https://github.com/Mark Meredith) — 7 commits
  • @erikaldsund — 5 commits
  • @Rasie1 — 4 commits

📝Recent commits

Click to expand
  • 2b43d3c — Update README.md (ipkn)
  • 49edf89 — Merge pull request #274 from mwm126/mingw-gmtime_s (ipkn)
  • f4d187a — Revert "Add MinGW test" (Mark Meredith)
  • c62634c — Revert "Fix compiler command" (Mark Meredith)
  • 1d95d16 — Revert "Test MinGW Travis build" (Mark Meredith)
  • d1a30bf — Avoid exceptions while closing sockets (ipkn)
  • 05d02fe — Remove printf warning for lld, llu (ipkn)
  • b7360a2 — Support multiple methods for same URL (ipkn)
  • daa1e3e — Add PURGE method, add a special enum item for counting (ipkn)
  • 6876a08 — Merge pull request #260 from erikaldsund/fix_rvalue_copy_ctor_bug (ipkn)

🔒Security observations

  • High · Unmaintained Project with Known Vulnerabilities — README.md, entire repository. The README explicitly states 'NOT MAINTAINED ANYMORE' and directs users to a working fork at CrowCpp/Crow. This means security patches and vulnerability fixes are not being applied to this codebase. Any vulnerabilities discovered will remain unpatched. Fix: Migrate to the actively maintained fork at https://github.com/CrowCpp/Crow for security updates and bug fixes.
  • High · HTTP Parser with Potential Vulnerabilities — include/crow/http_parser_merged.h. The file 'http_parser_merged.h' appears to be a merged/amalgamated HTTP parser. Merged third-party code is difficult to track for security updates and may contain known CVEs. The HTTP parsing layer is critical for web security. Fix: Identify the original source of http_parser_merged.h and verify it's the latest version. Consider using maintained HTTP parsing libraries or switching to the maintained Crow fork.
  • High · SHA1 Implementation for Security-Sensitive Operations — include/crow/TinySHA1.hpp. TinySHA1.hpp is included, which implements SHA1. SHA1 is cryptographically broken and should not be used for security-critical operations like password hashing or digital signatures. If used for WebSocket handshakes or similar, it may be acceptable, but the usage should be audited. Fix: Audit all uses of SHA1 in the codebase. Replace with SHA-256 or stronger algorithms for any security-critical operations. Verify WebSocket implementation uses SHA1 only in the RFC-compliant handshake, not for cryptographic protection.
  • Medium · WebSocket Implementation Security Concerns — include/crow/websocket.h, examples/websocket/. WebSocket support is included (websocket.h, example_ws.cpp) but without detailed code review, potential issues include: lack of proper frame validation, missing origin checks, or inadequate TLS enforcement. WebSocket implementations are frequently vulnerable to attacks. Fix: Conduct a thorough security review of the WebSocket implementation. Ensure proper frame validation, origin checking, and mandatory TLS usage in production. Consider using well-audited WebSocket libraries.
  • Medium · SSL/TLS Implementation Not Verified — include/crow/socket_adaptors.h, examples/ssl/example_ssl.cpp. SSL support is present (socket_adaptors.h, example_ssl.cpp) but the file structure doesn't indicate what TLS library is used or its version. Without knowing the specific implementation, outdated or misconfigured TLS could be in use. Fix: Document which TLS library is used (likely OpenSSL/Boost.Asio). Verify it's using TLS 1.2 or higher, strong cipher suites, and certificate validation. Use the maintained Crow fork for updated TLS configurations.
  • Medium · JSON Parsing Without Input Validation Details — include/crow/json.h. The json.h header implements JSON parsing, which is vulnerable to DoS attacks if not properly constrained (e.g., deeply nested structures, large payloads). The implementation details are not visible for security assessment. Fix: Review JSON parsing implementation for DoS protections including: depth limits, payload size limits, and resource consumption bounds. Implement request size limits at the HTTP layer.
  • Medium · Template Engine Security (Mustache) — include/crow/mustache.h. Mustache template engine is included (mustache.h) which could be vulnerable to Server-Side Template Injection (SSTI) if user input is directly passed to templates without proper sanitization. Fix: Ensure all user-controlled input passed to templates is properly escaped. Use template auto-escaping features. Never pass unsanitized user input directly to template rendering functions. Perform code review of template handling in routing handlers.
  • Medium · Query String Parsing May Be Vulnerable — include/crow/query_string.h. query_string.h handles URL parameter parsing which could be vulnerable to parameter pollution attacks, excessively large parameters, or injection attacks if not properly validated. Fix: Implement strict query parameter validation: set maximum parameter count and size limits, validate parameter names and values against expected patterns,

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 · ipkn/crow — RepoPilot