This is the first-success path for the current 0.1.3 package line on Hex: install
the runtime, gate one code path, and optionally mount the admin UI.
1. Add dependencies
Runtime only:
{:rulestead, "~> 0.1"}Runtime plus admin UI:
{:rulestead, "~> 0.1"},
{:rulestead_admin, "~> 0.1"}Repo GA shipped in v1.0.0 on 2026-05-21, but adoption today still starts
from the 0.1.x sibling packages shown above.
2. Install and migrate
mix deps.get
mix rulestead.install
mix ecto.migrate
Phoenix first-hour path: Phoenix Integration Spine
(supervision → config → Plug → first Rulestead.Runtime eval → lifecycle-honest
flag create).
Lifecycle required at flag create: Every new flag must include
owner_ref(host-owned team or service reference) andexpected_expiration(review date). Rulestead does not maintain a team directory. See Flag Lifecycle and Create your first flag in the spine.
Evaluating first? Run the Adoption Lab (FleetDesk) to see Rulestead with realistic seeds and operator screens before installing into your app. Use
docker compose up --buildorscripts/demo/proof.sh.
3. Gate a code path
For the ordered Plug → snapshot runtime path, follow the Phoenix Integration Spine. Below is the payload-first contract for tests and simulations.
Build an explicit %Rulestead.Context{} and evaluate against a flag payload.
This is the canonical contract documented in ../flows/evaluation.md:
context =
Rulestead.Context.new(
environment: "production",
targeting_key: "user-123",
attributes: %{plan: :pro}
)
flag_payload = ... # from snapshot or store
with {:ok, result} <- Rulestead.evaluate(flag_payload, context) do
if result.enabled? do
render_v2(conn)
else
render_v1(conn)
end
endSnapshot runtime lookup
Phoenix apps with the snapshot cache typically use Rulestead.Runtime and
conn.assigns[:rulestead_context] — see the
Phoenix Integration Spine and
evaluation.md. Projection helpers on Rulestead
(enabled?/2, get_variant/2) accept flag payload + context, not a string
key on %Plug.Conn{}.
4. Optionally mount the admin UI
If your host Phoenix app needs the operator UI:
import RulesteadAdmin.Router
scope "/" do
pipe_through :browser
rulestead_admin "/admin/flags", policy: MyApp.RulesteadPolicy
endThe host contract is intentionally narrow: provide the required policy:
module, the documented session keys, and preserve the canonical ?env=
selector. The package-local details are in
../../rulestead_admin/README.md.
5. Continue from here
- In scope / deferred surfaces: Product Boundary
- Common mistakes: Footguns
- Product mental model: User Flows and JTBD
- Flag from birth to retirement: ../flows/flag-lifecycle.md
- Runtime usage: ../flows/evaluation.md
- Rules and precedence: ../flows/rulesets.md
- Explain and support workflows: ../flows/explainability.md
- Testing and fake-backed helpers: ../recipes/testing.md
- Adoption lab (evaluate before integrate): Adoption Lab
- Runnable proof path: ../../examples/demo/README.md