{"id":51455356,"url":"https://github.com/misaelzapata/fastfn","last_synced_at":"2026-07-06T00:01:30.878Z","repository":{"id":347692767,"uuid":"1158855488","full_name":"misaelzapata/fastfn","owner":"misaelzapata","description":"FastFN: build file-based APIs and SPAs with Python, Node.js, PHP, Lua, Rust, and Go, using one simple local-first runtime.","archived":false,"fork":false,"pushed_at":"2026-03-29T03:53:44.000Z","size":18098,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-29T05:26:33.319Z","etag":null,"topics":["aws-lamba-python","aws-lambda","aws-lambda-golang","aws-lambda-node","cloudflare-worker","cloudflare-workers","faas","faas-cli","faas-platform","lua","next","nextjs","node","node-js","nodejs","openresty","php","python","spa","vite"],"latest_commit_sha":null,"homepage":"https://fastfn.dev","language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/misaelzapata.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-16T02:07:49.000Z","updated_at":"2026-03-29T03:53:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/misaelzapata/fastfn","commit_stats":null,"previous_names":["misaelzapata/fastfn"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/misaelzapata/fastfn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/misaelzapata%2Ffastfn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/misaelzapata%2Ffastfn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/misaelzapata%2Ffastfn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/misaelzapata%2Ffastfn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/misaelzapata","download_url":"https://codeload.github.com/misaelzapata/fastfn/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/misaelzapata%2Ffastfn/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35172975,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws-lamba-python","aws-lambda","aws-lambda-golang","aws-lambda-node","cloudflare-worker","cloudflare-workers","faas","faas-cli","faas-platform","lua","next","nextjs","node","node-js","nodejs","openresty","php","python","spa","vite"],"created_at":"2026-07-06T00:01:30.145Z","updated_at":"2026-07-06T00:01:30.878Z","avatar_url":"https://github.com/misaelzapata.png","language":"Lua","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/logo.png\" alt=\"FastFN\" width=\"280\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eFastFN\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Start with one file, a friendly CLI, and a route tree that can grow into a real API or SPA without a rewrite later.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  FastFN keeps the terminal as the main control surface: scaffold routes, run locally, inspect docs, and ship a small API or SPA + API stack without a lot of glue.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/misaelzapata/fastfn\"\u003e\u003cimg alt=\"GitHub\" src=\"https://img.shields.io/badge/GitHub-misaelzapata%2Ffastfn-181717?logo=github\u0026logoColor=white\"\u003e\u003c/a\u003e\n  \u003ca href=\"./LICENSE\"\u003e\u003cimg alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-green.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://fastfn.dev/en/\"\u003e\u003cimg alt=\"Docs\" src=\"https://img.shields.io/badge/docs-live-0f766e\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://fastfn.dev/en/reference/cli/\"\u003e\u003cimg alt=\"Workflow: CLI-first\" src=\"https://img.shields.io/badge/workflow-CLI--first-2563eb\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://fastfn.dev/en/reference/http-api/\"\u003e\u003cimg alt=\"OpenAPI: built-in\" src=\"https://img.shields.io/badge/OpenAPI-built--in-0891b2\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://fastfn.dev/en/\"\u003e\u003cimg alt=\"Status: Alpha\" src=\"https://img.shields.io/badge/status-alpha-orange\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://fastfn.dev/en/explanation/architecture/\"\u003e\u003cimg alt=\"Runtimes: Python, Node, PHP, Lua, Rust, Go\" src=\"https://img.shields.io/badge/runtimes-python%20%7C%20node%20%7C%20php%20%7C%20lua%20%7C%20rust%20%7C%20go-0f766e\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://fastfn.dev/en/tutorial/first-steps/\"\u003e\u003cstrong\u003eQuick Start\u003c/strong\u003e\u003c/a\u003e\n  \u0026bull;\n  \u003ca href=\"https://fastfn.dev/en/tutorial/spa-and-api-together/\"\u003e\u003cstrong\u003eSPA + API\u003c/strong\u003e\u003c/a\u003e\n  \u0026bull;\n  \u003ca href=\"https://fastfn.dev/en/how-to/run-as-a-linux-service/\"\u003e\u003cstrong\u003eLinux Service\u003c/strong\u003e\u003c/a\u003e\n  \u0026bull;\n  \u003ca href=\"./examples\"\u003e\u003cstrong\u003eExamples\u003c/strong\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/demos/demo-init.gif\" alt=\"FastFN demo: scaffold, run, and curl Python + Node functions\" width=\"920\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"./assets/demos/demo-init-narrated.mp4\"\u003e\u003cstrong\u003eWatch MP4\u003c/strong\u003e\u003c/a\u003e\n  \u0026bull;\n  \u003ca href=\"https://fastfn.dev/en/tutorial/first-steps/\"\u003e\u003cstrong\u003eRead Quick Start\u003c/strong\u003e\u003c/a\u003e\n  \u0026bull;\n  \u003ca href=\"https://fastfn.dev/en/tutorial/spa-and-api-together/\"\u003e\u003cstrong\u003eServe SPA + API\u003c/strong\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003e [!WARNING]\n\u003e FastFN is **alpha-quality** software. The API surface is evolving and breaking changes may occur between minor versions. Do not use in production without understanding the risks.\n\n## Why People Pick FastFN\n\nFastFN is for teams that want a simple start, a clear mental model, and a CLI they can stay in while the project grows.\n\nIf you like the clarity of FastAPI or the file-routing feel of frameworks like Next.js, FastFN aims for that same low-friction start while letting one API tree mix Python, Node.js, PHP, Lua, Rust, and Go.\n\n- File routes feel local: `get.hello.py` becomes `GET /hello`\n- One API tree can mix Python, Node.js, PHP, Lua, Rust, and Go\n- OpenAPI and Swagger stay generated from the real route graph\n- Public assets can be mounted Cloudflare-style from `public/` or `dist/`\n- The CLI scaffolds, runs, documents, and validates the project in one loop\n\n| What You Want | With FastFN |\n| --- | --- |\n| Start fast | One file, one command |\n| Scale language choice | Mix runtimes in one API |\n| Keep docs current | OpenAPI generated from real routes |\n| Keep ops predictable | Gateway + contracts + tests in repo |\n\n## Start in 60 seconds\n\nThis is the shortest path from zero to a running route with docs.\n\n### 1) Install\n\nHomebrew:\n\n```bash\nbrew tap misaelzapata/homebrew-fastfn\nbrew install fastfn\n```\n\nFrom source:\n\n```bash\ncd cli \u0026\u0026 go build -o ../bin/fastfn\n./bin/fastfn --help\n```\n\n### 2) Write one function\n\n`functions/get.hello.py`\n\n```python\ndef main(req):\n    name = (req.get(\"query\") or {}).get(\"name\", \"World\")\n    return {\"message\": f\"Hello, {name}!\"}\n```\n\n### 3) Run\n\n```bash\nfastfn dev functions\n```\n\nTry it:\n\n```bash\ncurl -sS \"http://127.0.0.1:8080/hello?name=Developer\"\n```\n\nDocs:\n\n- Swagger UI: `http://127.0.0.1:8080/docs`\n- OpenAPI JSON: `http://127.0.0.1:8080/_fn/openapi.json`\n\nThat is the core loop: create a file, run `fastfn dev`, and call the route.\n\nWhen a handler needs external packages, the fastest and most predictable path is still an explicit `requirements.txt` or `package.json`.\nFastFN can also infer dependencies for Python and Node, and it now supports optional backends like `pipreqs`, `detective`, and `require-analyzer`, but that path is slower and is best treated as a bootstrap tool for quick demos or first drafts.\n\n## A CLI You Can Stay In\n\nFastFN is meant to feel simple from the terminal: scaffold a route, run it, inspect docs, and validate the project without switching mental models.\n\nCommon commands you will actually use:\n\n```bash\nfastfn init hello -t python\nfastfn dev .\nfastfn docs\nfastfn doctor domains --domain api.example.com\nfastfn run --native .\nfastfn --help\n```\n\nThat gives you the main loop:\n\n- scaffold with `init`\n- run locally with `dev`\n- open live docs with `docs`\n- check domains or config with `doctor`\n- switch to native mode with `run --native`\n\nFor the simplest SPA + API setup, keep your frontend build in `dist/` or `public/`, keep your API under `api/`, and let FastFN serve both under one base URL with almost no glue.\nThe [SPA + API tutorial](https://fastfn.dev/en/tutorial/spa-and-api-together/) walks through that setup directly.\n\n## Repository Layout\n\n- `cli/`: Go CLI source and local test runners.\n- `cli/tools/`: local helper scripts.\n- `openresty/`: gateway/runtime Lua and console assets.\n- `examples/`: runnable examples and demos.\n- `tests/unit/`: runtime and SDK unit checks.\n- `tests/integration/`: API/OpenAPI/native/hot-reload checks.\n- `tests/e2e/`: browser/UI tests.\n- `tests/stress/`: benchmark scenarios.\n- `tests/results/`: generated artifacts from test runs.\n- `docs/`: MkDocs source (`docs/en`, `docs/es`) and theme overrides.\n\n## Documentation\n\n- Start: [Docs Home](https://fastfn.dev/en/)\n- First steps: [Quick Start](https://fastfn.dev/en/tutorial/first-steps/)\n- SPA + API: [Serve a SPA and API Together](https://fastfn.dev/en/tutorial/spa-and-api-together/)\n- Linux service: [Run FastFN as a Linux Service](https://fastfn.dev/en/how-to/run-as-a-linux-service/)\n- Routing: [`docs/en/tutorial/routing.md`](./docs/en/tutorial/routing.md)\n- CLI reference: [`docs/en/reference/cli.md`](./docs/en/reference/cli.md)\n- HTTP/OpenAPI: [`docs/en/reference/http-api.md`](./docs/en/reference/http-api.md)\n- Function spec: [`docs/en/reference/function-spec.md`](./docs/en/reference/function-spec.md)\n- Architecture: [`docs/en/explanation/architecture.md`](./docs/en/explanation/architecture.md)\n- Public assets: [`docs/en/articles/cloudflare-style-public-assets.md`](./docs/en/articles/cloudflare-style-public-assets.md)\n\n## Configuration (`fastfn.json`)\n\nFastFN reads `fastfn.json` in the current directory by default.\n\n```json\n{\n  \"functions-dir\": \"functions\",\n  \"public-base-url\": \"https://api.example.com\",\n  \"openapi-include-internal\": false\n}\n```\n\nKey behavior:\n\n- `openapi-include-internal` defaults to `false`.\n- Env override for internal visibility: `FN_OPENAPI_INCLUDE_INTERNAL`.\n- `public-base-url` controls `servers[0].url` in generated OpenAPI.\n- `domains` helps CLI doctor checks; host enforcement at runtime lives in per-function `invoke.allow_hosts`.\n\nReference:\n\n- [`docs/en/reference/fastfn-config.md`](./docs/en/reference/fastfn-config.md)\n- [`docs/en/reference/function-spec.md`](./docs/en/reference/function-spec.md)\n\n## License\n\nMIT. See [`LICENSE`](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmisaelzapata%2Ffastfn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmisaelzapata%2Ffastfn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmisaelzapata%2Ffastfn/lists"}