Current section
Files
Jump to
Current section
Files
mix.exs
defmodule Mead.MixProject do
use Mix.Project
@version "0.1.0"
@source_url "https://github.com/jakeprem/mead"
def project do
[
app: :mead_pdf,
version: @version,
elixir: "~> 1.20",
elixirc_paths: elixirc_paths(Mix.env()),
start_permanent: Mix.env() == :prod,
description:
"Native PDF generation for Elixir: react-pdf-style ~PDF templates, flexbox layout, and a pure-Rust render backend. No browser, no external binaries.",
package: package(),
source_url: @source_url,
docs: docs(),
deps: deps(),
aliases: aliases(),
usage_rules: usage_rules()
]
end
defp docs do
[
name: "Mead",
main: "readme",
source_ref: "v#{@version}",
extras: ["README.md", "CHANGELOG.md", "LICENSE"],
groups_for_modules: [
Core: [Mead, Mead.Node, Mead.Style],
Templates: [Mead.Component, Mead.Markup],
Fonts: [Mead.FontSet, Mead.Session]
]
]
end
defp package do
[
name: "mead_pdf",
licenses: ["MIT"],
links: %{"GitHub" => @source_url},
# native source + workspace manifests ship for the MEAD_BUILD=1
# source-build fallback; priv/fonts is the bundled default face.
files: ~w(
lib
native/mead_nif/src
native/mead_nif/Cargo.toml
native/mead_nif/Cargo.lock
priv/fonts
mix.exs
README.md
LICENSE
CHANGELOG.md
checksum-*.exs
)
]
end
# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger]
]
end
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
# Run "mix help deps" to learn about dependencies.
defp deps do
[
# Optional at runtime: only needed when MEAD_BUILD=1 forces a source
# build (or during development of mead itself); users normally get a
# precompiled NIF via rustler_precompiled.
{:rustler, "~> 0.38", optional: true},
{:rustler_precompiled, "~> 0.8"},
# Templating layer only (see SPEC.md layering rule): TagEngine powers
# the ~PDF sigil, Phoenix.Component provides attr/slot validation.
{:phoenix_live_view, "~> 1.0"},
# Parses the markup emitted by ~PDF templates back into Node trees.
# (Lenient HTML parsing: boolean attrs render bare, which XML rejects.)
{:floki, "~> 0.36"},
# Dev/test tooling.
{:stream_data, "~> 1.1", only: [:dev, :test]},
{:credo, "~> 1.7", only: [:dev, :test], runtime: false},
{:styler, "~> 1.0", only: [:dev, :test], runtime: false},
{:usage_rules, "~> 1.2", only: [:dev]},
{:ex_doc, "~> 0.34", only: :dev, runtime: false},
# Tidewave runtime MCP server. No Phoenix endpoint here, so it's served
# standalone via Bandit through the `mix tidewave` alias below.
{:tidewave, "~> 0.6", only: :dev},
{:bandit, "~> 1.0", only: :dev}
]
end
defp aliases do
[
# Serves the Tidewave MCP endpoint at http://localhost:4000/tidewave/mcp
# (plain-Elixir setup: Bandit hosts the Tidewave plug, no Phoenix needed).
tidewave: "run --no-halt -e 'Agent.start(fn -> Bandit.start_link(plug: Tidewave, port: 4000) end)'"
]
end
defp usage_rules do
[
skills: [
location: ".claude/skills",
build: [
"elixir-core": [
description:
"Core Elixir and OTP usage rules, plus dependency doc search via mix usage_rules.search_docs. Consult when writing nontrivial Elixir.",
usage_rules: [:usage_rules]
]
]
]
]
end
end