Ingot

Ingot Logo

Hex.pmDocumentationDownloadsLicenseGitHub

Ingot is a Phoenix LiveView application for sample generation and human labeling workflows, built on top of Forge and Anvil.

In a world already full of perfectly good data labeling tools, Ingot is the one that runs on the BEAM for reasons that, in hindsight, appear to be intentional.


What is Ingot?

Ingot is a thin web shell around two Elixir libraries:

Ingot’s job is to:

Think of it as the UI layer that turns Forge + Anvil into a usable product, without smuggling any domain logic into Phoenix.


Features

LiveView Labeling Interface

Admin & Monitoring

Workflow Characteristics


When to Use Ingot

You might want Ingot if:

You probably don’t want Ingot if you just need a generic labeling SaaS in five minutes. There are plenty of those.


Installation

Prerequisites

Setup

git clone https://github.com/North-Shore-AI/ingot.git
cd ingot

Install dependencies:

mix setup

Start the Phoenix server:

mix phx.server
# or
iex -S mix phx.server

Then open http://localhost:4000.


Configuration

Application configuration lives under config/.

Key options:

# config/config.exs
config :ingot,
  # Session timeout in milliseconds
  session_timeout: :timer.hours(2),

  # Maximum samples per labeling session
  max_samples_per_session: 500,

  # Enable/disable keyboard shortcuts
  keyboard_shortcuts_enabled: true

You’ll also need to configure Forge and Anvil (pipelines, queues, label schemas) in your umbrella or host application.


Usage

1. Define Samples and Queues

In your Elixir app (outside Ingot):

Ingot doesn’t care about the domain; it just talks to Forge/Anvil.

2. Labeling Flow (Labeler View)

By default:

  1. Navigate to /label
  2. Ingot fetches the next assignment from Anvil
  3. LiveView renders the form derived from the label schema
  4. Labeler completes fields / ratings (keyboard shortcuts where enabled)
  5. Submit → Ingot writes labels via Anvil → next assignment

Typical keyboard shortcuts (configurable):

3. Admin Flow

Navigate to /dashboard to:


Project Structure

ingot/
├── lib/
│   ├── ingot/
│   │   └── application.ex          # Application supervisor
│   └── ingot_web/
│       ├── components/
│       │   └── core_components.ex  # Shared UI components
│       ├── live/
│       │   ├── labeling_live.ex    # Labeling interface
│       │   ├── dashboard_live.ex   # Admin dashboard
│       │   └── components/
│       │       ├── sample_component.ex
│       │       ├── label_form_component.ex
│       │       └── progress_component.ex
│       ├── router.ex               # Routes
│       └── endpoint.ex             # Phoenix endpoint
├── assets/                         # Frontend assets
├── docs/
│   └── adrs/                       # Architecture decision records
└── test/
    └── ingot_web/
        └── live/                   # LiveView tests

Testing

Run the test suite:

mix test

With coverage:

mix test --cover

Precommit-style checks (format, compile, test) if wired:

mix precommit

Architecture Notes

Detailed decisions live in docs/adrs/, including:

The short version: Phoenix only does presentation and request orchestration; the actual thinking happens in the libraries.


Dependencies


Contributing

If you, too, feel that the universe needed a BEAM-native data labeling UI:

  1. Fork the repo
  2. Create a branch: git checkout -b feature/thing
  3. Make changes
  4. Run tests: mix precommit (or at least mix test)
  5. Open a PR

License

Copyright (c) 2025 North Shore AI

This project is part of the North Shore AI organization.


Links

For questions or support, please open an issue on GitHub.