{"id":26468793,"url":"https://github.com/novaframework/nova","last_synced_at":"2026-04-02T13:12:41.460Z","repository":{"id":35050853,"uuid":"200821829","full_name":"novaframework/nova","owner":"novaframework","description":"Web framework for Erlang.","archived":false,"fork":false,"pushed_at":"2025-05-08T14:24:45.000Z","size":1219,"stargazers_count":237,"open_issues_count":4,"forks_count":22,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-05-13T13:01:09.502Z","etag":null,"topics":["api-server","distributed","erlang","realtime","web-framework"],"latest_commit_sha":null,"homepage":"http://www.novaframework.org","language":"Erlang","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/novaframework.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-08-06T09:39:22.000Z","updated_at":"2025-05-08T09:02:53.000Z","dependencies_parsed_at":"2023-10-24T12:32:29.004Z","dependency_job_id":"f0ca29ed-cd80-4175-bbd9-2265a59e0720","html_url":"https://github.com/novaframework/nova","commit_stats":{"total_commits":899,"total_committers":14,"mean_commits":64.21428571428571,"dds":0.3659621802002224,"last_synced_commit":"089293e3308bd1c6fe0f5fca776b97ebaff1a036"},"previous_names":[],"tags_count":57,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/novaframework%2Fnova","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/novaframework%2Fnova/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/novaframework%2Fnova/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/novaframework%2Fnova/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/novaframework","download_url":"https://codeload.github.com/novaframework/nova/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253948436,"owners_count":21988957,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["api-server","distributed","erlang","realtime","web-framework"],"created_at":"2025-03-19T16:57:49.644Z","updated_at":"2026-04-02T13:12:41.455Z","avatar_url":"https://github.com/novaframework.png","language":"Erlang","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/novaframework/nova/master/priv/static/nova.png\" alt=\"Nova\" width=\"200\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eA web framework for the BEAM\u003c/strong\u003e\u003cbr\u003e\n  Build fault-tolerant, distributed web applications in Erlang, Elixir, or LFE.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/novaframework/nova/actions/workflows/erlang.yml\"\u003e\u003cimg src=\"https://github.com/novaframework/nova/actions/workflows/erlang.yml/badge.svg\" alt=\"Build Status\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://hex.pm/packages/nova\"\u003e\u003cimg src=\"https://img.shields.io/hexpm/v/nova.svg\" alt=\"Hex.pm\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://hexdocs.pm/nova/\"\u003e\u003cimg src=\"https://img.shields.io/badge/docs-hexdocs-blue.svg\" alt=\"Docs\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://erlef.org/slack-invite/erlanger\"\u003e\u003cimg src=\"https://img.shields.io/badge/chat-Erlang%20Slack-4A154B.svg\" alt=\"Slack\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Why Nova?\n\nNova is the web framework for the **BEAM**. Whether you write Erlang, Elixir, or LFE, Nova gives you the productivity of a modern web framework on the runtime you already trust:\n\n- **Routing, controllers, and views** — familiar MVC patterns that map naturally to Erlang modules\n- **Plugin pipeline** — composable middleware for auth, CORS, logging, and custom concerns\n- **WebSockets and Pub/Sub** — real-time features backed by OTP's `pg` module, distributed out of the box\n- **Session management** — ETS-backed by default, pluggable for custom backends\n- **Template rendering** — ErlyDTL (Django Template Language) with hot reload\n- **OTP-native** — your web app is a proper OTP application with supervision trees, hot code upgrades, and releases\n\nNova runs on [Cowboy](https://github.com/ninenines/cowboy) and supports **Erlang**, **Elixir**, and **LFE**.\n\n## Quick start\n\nInstall the rebar3 plugin:\n\n```bash\n# One-line install\nsh -c \"$(curl -fsSL https://raw.githubusercontent.com/novaframework/rebar3_nova/master/install.sh)\"\n\n# Or add to ~/.config/rebar3/rebar.config\n{project_plugins, [rebar3_nova]}.\n```\n\nCreate and run your app:\n\n```bash\nrebar3 new nova my_app\ncd my_app\nrebar3 nova serve\n```\n\nOpen [localhost:8080](http://localhost:8080) — you're running Nova.\n\n## What a controller looks like\n\n```erlang\n-module(my_app_main_controller).\n-export([index/1, create/1]).\n\nindex(#{method := \u003c\u003c\"GET\"\u003e\u003e} = _Req) -\u003e\n    {json, #{message =\u003e \u003c\u003c\"Hello from Nova!\"\u003e\u003e}}.\n\ncreate(#{method := \u003c\u003c\"POST\"\u003e\u003e, json := Body} = _Req) -\u003e\n    %% Validate, persist, respond\n    {json, #{status =\u003e \u003c\u003c\"created\"\u003e\u003e, data =\u003e Body}}.\n```\n\nRoute it:\n\n```erlang\nroutes(_Environment) -\u003e\n    [#{prefix =\u003e \"/api\",\n       security =\u003e false,\n       routes =\u003e [\n           {\"/\", {my_app_main_controller, index}},\n           {\"/items\", {my_app_main_controller, create}}\n       ]}].\n```\n\n## Features\n\n| Feature | Details |\n|---------|---------|\n| **Routing** | Path parameters, prefixes, per-route security, environment-based routing |\n| **Controllers** | Return `{json, Map}`, `{ok, Variables}`, `{status, Code}`, `{redirect, Path}`, `{sendfile, ...}` |\n| **Plugins** | Pre/post request hooks — built-in CORS, CSRF, correlation ID, or write your own |\n| **WebSockets** | Full WebSocket support via `nova_websocket` behaviour |\n| **Pub/Sub** | Distributed messaging via `nova_pubsub` — channels, topics, broadcast |\n| **Sessions** | ETS-backed sessions with pluggable backends |\n| **Templates** | ErlyDTL (Django-style) with hot reload via `rebar3 nova serve` |\n| **Security** | Per-route security functions for authentication and authorization |\n| **Static files** | Built-in file controller with range request support |\n| **Observability** | [OpenTelemetry integration](https://github.com/novaframework/opentelemetry_nova) for tracing and metrics |\n| **Database** | [Kura](https://github.com/novaframework/kura) — an Ecto-inspired database layer for Erlang |\n\n## Request pipeline\n\n```\nRequest → Cowboy → Nova Router → Plugins (pre) → Security → Controller → Plugins (post) → Response\n```\n\n## Ecosystem\n\n| Package | Description |\n|---------|-------------|\n| [nova](https://hex.pm/packages/nova) | Core framework |\n| [rebar3_nova](https://github.com/novaframework/rebar3_nova) | Project scaffolding and generators |\n| [nova_test](https://github.com/novaframework/nova_test) | Testing utilities and request builder |\n| [kura](https://hex.pm/packages/kura) | Database layer — schemas, migrations, changesets, queries |\n| [rebar3_kura](https://github.com/novaframework/rebar3_kura) | Migration generator for Kura |\n| [opentelemetry_nova](https://github.com/novaframework/opentelemetry_nova) | Automatic OpenTelemetry instrumentation |\n\n## Documentation\n\n- **[The Nova Book](https://novaframework.github.io/nova-book)** — step-by-step tutorial building a complete blog platform\n- **[API Reference](https://hexdocs.pm/nova/)** — module documentation on HexDocs\n- **[Quick Start Guide](https://hexdocs.pm/nova/quick-start.html)** — get up and running in 5 minutes\n\n## Requirements\n\n- Erlang/OTP 23+\n- Rebar3\n\n## Community\n\n- [Erlang Slack](https://erlef.org/slack-invite/erlanger) — `#erlanger` channel\n- [Nova Forum](https://erlangforums.com/c/erlang-frameworks/nova-forum/65) — questions and discussion\n- [Issue Tracker](https://github.com/novaframework/nova/issues) — bugs and feature requests\n\n## Contributing\n\nContributions are welcome! Check [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) and look for issues labeled `good first issue`.\n\n## License\n\n[Apache 2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnovaframework%2Fnova","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnovaframework%2Fnova","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnovaframework%2Fnova/lists"}