ProwlEngine/Anthology

The collection of libraries that power the Prowl game engine.

20

stars

2,138

commits

C#

primary language

Sep 11, 2026

updated

README

Anthology

The collection of modular libraries that power the Prowl game engine.

Each library ships as its own Prowl.* NuGet package and can be used independently, but they live and version together in this one repository so that a change spanning several of them lands in a single commit, no cross-repo version juggling, no publish chain.

Libraries

FolderPackagePurpose
VectorProwl.VectorMath and geometry primitives
ScribeProwl.ScribeTrueType fonts, layout, Markdown
QuillProwl.QuillGPU 2D vector graphics
PaperProwl.PaperImmediate-mode UI framework
ScaffoldProwl.ScaffoldIncremental UI layout engine
OrigamiProwl.OrigamiUI Widgets/Components for paper
EchoProwl.EchoSerialization
ClayProwl.Clay3D Model Loading (GLTF/FBX/Obj)
CrumbProwl.CrumbA simple lightweight Tokenizer
PhotonicProwl.PhotonicProgressive CPU Lightmapper
UnwrapperProwl.UnwrapperMesh Unwrapping for UV's
WickedProwl.WickedHigh Level Networking Library
RosettaProwl.RosettaLocalization utilities
DriftProwl.Drift2D Physics Engine
SlangProwl.SlangBindings for the Sland Compiler
GraphiteProwl.GraphiteLow-level GPU graphics (Vulkan / D3D11); also .Compiler, .ShaderDef, .Variants
RecastProwl.RecastDotRecast fork for Navmesh generation and pathfinding
ApertureProwl.ApertureImage loading (BMP/DDS/EXR/GIF/HDR/ICO/JPEG/PNG/PNM/PSD/RAW/TGA/TIFF/WebP)

Versioning

The whole family ships under one version, set once in Directory.Build.props. Bump that single <Version> and tag the commit vX.Y.Z; CI builds, packs and pushes every package at that version.

Repository layout

Every library is a self-contained folder. Shared build and packaging rules live in the root Directory.Build.props, so individual project files stay small.

History for each library is preserved under its folder, so git log -- Scribe/ shows the full past of that library.

How it works

Develop Libraries independantly of this Repo, once their stable and near-finished, We merge them into here to make them official.

scripts/Merge-Library.ps1 clones the source, runs git-filter-repo to rewrite every commit so the files live under a <Name>/ subfolder, then merges that rewritten history into Anthology with --allow-unrelated-histories. The result: git log -- Scribe/ shows the complete history of Scribe, so commits stay sortable by package forever.

git-filter-repo (a single Python file) is bundled in scripts/, so only Python is required.

Per-library steps

From the Anthology repo root, with a clean working tree:

./scripts/Merge-Library.ps1 -Name Vector -Source ../Prowl.Vector

After each fold-in: clean up the .csproj

The root Directory.Build.props now supplies the shared settings, so trim each library's project file:

  1. Remove <Version> so the unified version wins. This matters - a leftover <Version> would override the family version and could republish at an old number.
  2. Remove now-redundant lines: <Authors>, <PackageId>, <RootNamespace>, <TargetFrameworks> (only if identical to the shared set), and the <None Include="..\LICENSE" .../> pack item (the shared LICENSE is packed centrally; leaving it causes a duplicate-file pack error).
  3. Flip internal references from package to project, e.g. in Quill:
    <!-- was: <PackageReference Include="Prowl.Scribe" Version="1.0.2" /> -->
    <ProjectReference Include="..\..\Scribe\Scribe\Scribe.csproj" />
    
  4. Keep: <Title>, <Description>, <PackageTags>, and the project's own README packing.

Gotcha: duplicate project names

Most repos have a project literally named Tests (and Samples). Several Tests.csproj in one solution collide on assembly name and output path. Rename each to <Name>.Tests (e.g. Scribe.Tests) when cleaning up. Prowl.Crumb already uses Prowl.Crumb.Tests, so it needs no rename.

Gotcha: projects already named Prowl.X

The shared PackageId is Prowl.$(AssemblyName), which assumes assemblies are named without the prefix (Echo -> Prowl.Echo). Prowl.Crumb is already named with the prefix, so it must be renamed to Crumb.

Verifying

git log --oneline -- Vector/      # full Vector history, under its folder
dotnet build Anthology.slnx -c Release

Still private / unfinished

Anything not ready for public release (e.g. anything still cooking) stays in its own repo and is not folded in yet - merging publishes its entire history. Fold it in when it is ready to ship, optionally squashed if its history should not be public.

Contributors

michaelsakharov

1,247 commits

sinnwrig

629 commits

jhm-ciberman

106 commits

mic-code

72 commits

ProwlEngine/Anthology

The collection of libraries that power the Prowl game engine.

20

stars

2,138

commits

C#

primary language

Sep 11, 2026

updated

README

Anthology

The collection of modular libraries that power the Prowl game engine.

Each library ships as its own Prowl.* NuGet package and can be used independently, but they live and version together in this one repository so that a change spanning several of them lands in a single commit, no cross-repo version juggling, no publish chain.

Libraries

FolderPackagePurpose
VectorProwl.VectorMath and geometry primitives
ScribeProwl.ScribeTrueType fonts, layout, Markdown
QuillProwl.QuillGPU 2D vector graphics
PaperProwl.PaperImmediate-mode UI framework
ScaffoldProwl.ScaffoldIncremental UI layout engine
OrigamiProwl.OrigamiUI Widgets/Components for paper
EchoProwl.EchoSerialization
ClayProwl.Clay3D Model Loading (GLTF/FBX/Obj)
CrumbProwl.CrumbA simple lightweight Tokenizer
PhotonicProwl.PhotonicProgressive CPU Lightmapper
UnwrapperProwl.UnwrapperMesh Unwrapping for UV's
WickedProwl.WickedHigh Level Networking Library
RosettaProwl.RosettaLocalization utilities
DriftProwl.Drift2D Physics Engine
SlangProwl.SlangBindings for the Sland Compiler
GraphiteProwl.GraphiteLow-level GPU graphics (Vulkan / D3D11); also .Compiler, .ShaderDef, .Variants
RecastProwl.RecastDotRecast fork for Navmesh generation and pathfinding
ApertureProwl.ApertureImage loading (BMP/DDS/EXR/GIF/HDR/ICO/JPEG/PNG/PNM/PSD/RAW/TGA/TIFF/WebP)

Versioning

The whole family ships under one version, set once in Directory.Build.props. Bump that single <Version> and tag the commit vX.Y.Z; CI builds, packs and pushes every package at that version.

Repository layout

Every library is a self-contained folder. Shared build and packaging rules live in the root Directory.Build.props, so individual project files stay small.

History for each library is preserved under its folder, so git log -- Scribe/ shows the full past of that library.

How it works

Develop Libraries independantly of this Repo, once their stable and near-finished, We merge them into here to make them official.

scripts/Merge-Library.ps1 clones the source, runs git-filter-repo to rewrite every commit so the files live under a <Name>/ subfolder, then merges that rewritten history into Anthology with --allow-unrelated-histories. The result: git log -- Scribe/ shows the complete history of Scribe, so commits stay sortable by package forever.

git-filter-repo (a single Python file) is bundled in scripts/, so only Python is required.

Per-library steps

From the Anthology repo root, with a clean working tree:

./scripts/Merge-Library.ps1 -Name Vector -Source ../Prowl.Vector

After each fold-in: clean up the .csproj

The root Directory.Build.props now supplies the shared settings, so trim each library's project file:

  1. Remove <Version> so the unified version wins. This matters - a leftover <Version> would override the family version and could republish at an old number.
  2. Remove now-redundant lines: <Authors>, <PackageId>, <RootNamespace>, <TargetFrameworks> (only if identical to the shared set), and the <None Include="..\LICENSE" .../> pack item (the shared LICENSE is packed centrally; leaving it causes a duplicate-file pack error).
  3. Flip internal references from package to project, e.g. in Quill:
    <!-- was: <PackageReference Include="Prowl.Scribe" Version="1.0.2" /> -->
    <ProjectReference Include="..\..\Scribe\Scribe\Scribe.csproj" />
    
  4. Keep: <Title>, <Description>, <PackageTags>, and the project's own README packing.

Gotcha: duplicate project names

Most repos have a project literally named Tests (and Samples). Several Tests.csproj in one solution collide on assembly name and output path. Rename each to <Name>.Tests (e.g. Scribe.Tests) when cleaning up. Prowl.Crumb already uses Prowl.Crumb.Tests, so it needs no rename.

Gotcha: projects already named Prowl.X

The shared PackageId is Prowl.$(AssemblyName), which assumes assemblies are named without the prefix (Echo -> Prowl.Echo). Prowl.Crumb is already named with the prefix, so it must be renamed to Crumb.

Verifying

git log --oneline -- Vector/      # full Vector history, under its folder
dotnet build Anthology.slnx -c Release

Still private / unfinished

Anything not ready for public release (e.g. anything still cooking) stays in its own repo and is not folded in yet - merging publishes its entire history. Fold it in when it is ready to ship, optionally squashed if its history should not be public.

Contributors

michaelsakharov

1,247 commits

sinnwrig

629 commits

jhm-ciberman

106 commits

mic-code

72 commits

Languages

C#

97.1%

Python

1.4%