# Ramal v0.2.0 - Table of Contents > Data branches as BEAM processes: Git-style branches of Ash application data that you fork, diff and merge. ## Pages - [README](readme.md) - [Contributing to Ramal](contributing.md) - [Changelog](changelog.md) - Guides - [Ramal design](design.md) - [Roadmap](roadmap.md) - [0001. Ramal.Change is the diff struct; the write-side hook is Ramal.Capture](0001-change-struct-and-capture-module.md) - [0002. The current branch travels in the process dictionary and in Ash's shared context](0002-current-branch-carrier.md) - [0003. Branch process lifecycle: supervisor-level limits, kept discards, config-last storage](0003-branch-process-lifecycle.md) - [0004. Read patching: where it hooks in and what it does differently from the first design](0004-read-patching-hooks.md) - [0005. Write capture: hook, atomic fallback, bulk, notifications and errors](0005-write-capture.md) - [0006. Fingerprints, snapshots and fork](0006-fingerprints-and-fork.md) - [0007. Merge: claim, check, replay](0007-merge.md) - [0008. Postgres storage and the codec](0008-postgres-storage.md) - [0009. Multitenancy is refused inside a branch](0009-multitenancy-refused.md) - [0010. Stored actors drop sensitive attributes](0010-stored-actors.md) - [0011. Aggregates over a branch are computed from the patched rows](0011-branch-aggregates.md) - [0012. Proposals are a branch status and a field](0012-proposals.md) - [0013. Aggregates read only the overlaid rows](0013-aggregate-delta.md) - [0014. Many-to-many join resources](0014-many-to-many-join-resources.md) - [0015. The inspector is a separate project mounted by a router macro in the host's own live_session](0015-inspector-mounting.md) - [0016. Security defaults: fail closed, print nothing a branch holds, read storage defensively](0016-security-defaults.md) ## Modules - [Ramal](Ramal.md): Data branches as BEAM processes. - [Ramal.Aggregate](Ramal.Aggregate.md): Aggregates for `Ramal.aggregate/4`: a pure computation over a list of records, and the delta path that uses it. - [Ramal.Branch](Ramal.Branch.md): A branch: the struct a branch process holds and storage persists, plus the pure functions over it. - [Ramal.Capture](Ramal.Capture.md): The change `Ramal.Resource` installs on every create, update and destroy action. - [Ramal.Change](Ramal.Change.md): One row-level difference between a branch and its base, as `Ramal.diff/1` returns it. - [Ramal.Merge](Ramal.Merge.md): Merges a branch into the base: checks that the base did not move under the branch, then replays the branch's log through the application's real actions inside one transaction. - [Ramal.Merge.Result](Ramal.Merge.Result.md): What `Ramal.merge/2` returns on success. - [Ramal.Overlay](Ramal.Overlay.md): The overlay: what a branch changed, as a plain map. - [Ramal.Preparation](Ramal.Preparation.md): The read preparation `Ramal.Resource` installs on every read action. - [Ramal.Resource](Ramal.Resource.md): The Spark extension that makes an Ash resource branchable. - [Ramal.Storage](Ramal.Storage.md): Where branches are kept while no process holds them. - [Ramal.Storage.Codec](Ramal.Storage.Codec.md): Turns a branch into a JSON-safe map and back, for storage backends that keep text (`Ramal.Storage.Postgres` keeps it in a `jsonb` column). - [Ramal.Storage.ETS](Ramal.Storage.ETS.md): Keeps branches in an ETS table owned by `Ramal.Supervisor`. The default backend in tests and development. - [Ramal.Storage.Postgres](Ramal.Storage.Postgres.md): Keeps branches in the `ramal_branches` table of the host's Postgres, so they survive a restart. - [Ramal.Supervisor](Ramal.Supervisor.md): The supervision tree of Ramal. Add it to the host application's tree - [Ramal.Telemetry](Ramal.Telemetry.md): The telemetry events Ramal emits, in one place. - Exceptions - [Ramal.Error](Ramal.Error.md): The error every Ramal function returns as `{:error, %Ramal.Error{}}`. ## Mix Tasks - [mix ramal.gen.migration](Mix.Tasks.Ramal.Gen.Migration.md): Writes a migration that creates the `ramal_branches` table `Ramal.Storage.Postgres` uses.