Skip to main content
lineforge: open-source MCP-enabled transmission line calculator

CI Docs License: AGPL v3 Python 3.11+ Rust mypy: strict ruff Code style: black MCP eng-mcp-suite

Compute Z₀, εₑff, L, C, Rs, Gp for any 2D transmission line cross-section. From your Python notebook, terminal, or AI agent.

Quick start · What it solves · Accuracy · Documentation · Roadmap


What is lineforge?

lineforge is a programmable transmission-line calculator built for the analysis workflows. It computes RLGC parameters: characteristic impedance Z₀, effective permittivity εₑff, phase velocity v_p, distributed inductance L, capacitance C, skin-effect resistance Rs, and dielectric conductance Gp: for any 2D transmission line cross-section.

Drive it from Python, the terminal, any LLM agent over Model Context Protocol, or the chat-driven web GUI (lineforge gui). Closed-form analytical solvers for the common geometries (microstrip, stripline, coplanar, differential pairs, three-conductor lines) hand off seamlessly to a bitmap FD-Laplace + Faraday solver for arbitrary cross-sections. Accuracy depends on the geometry, model, mesh, and boundary conditions. See the validation examples and tests for the cases checked.

What lineforge does well:

  • AI-native via MCP. First-class Model Context Protocol server with 14 tools. Any Claude / LLM agent can drive it. Long solves use the SEP-1686 Tasks pattern.
  • Three equal surfaces. MCP server, CLI, and Python API are all available through a shared solver library.
  • Modern numerics. Python+NumPy+SciPy orchestration with PyAMG multigrid + scipy.sparse BiCGSTAB+ILU0 solvers. Rust-accelerated kernels via PyO3 for inner loops (currently scaffolded; full implementation in Phase 5).
  • atlc2-format compatible. Existing atlc2 BMP usermaps, MoreColors.txt files, and .txt script files run unchanged via the bitmap solver. New .lineforge.json is the modern alternative.
  • Validation. Closed-form solvers cross-checked against scikit-rf and IPC-2141A reference values; bitmap solvers validated against analytical coax (Z₀ ±10%) and wire-pair (DC L ±25%) closed forms.
  • AGPLv3. See LICENSE for the terms.

Quick start

Install

lineforge is not published on PyPI, so a lineforge package there is not this project. Install it from GitHub (Python 3.11 or newer):

pip install "lineforge @ git+https://github.com/RFingAdam/lineforge.git"

To work on lineforge or run the web GUI (which needs the repo's frontend/), install from a clone instead:

git clone https://github.com/RFingAdam/lineforge.git
cd lineforge
pip install -e ".[dev,gui]"

The GUI extra is required for the web interface and the complete test suite. Either way pip builds the Rust core during install, so you need a Rust toolchain on your PATH.

Three surfaces, same answer

Python

import lineforge

# 50Ω microstrip on 4 mil FR4
r = lineforge.microstrip(
    W="6mil", H="4mil", T="1.4mil", er=4.4
)
print(f"Z0 = {r.z0:.2f} Ω")
print(f"εeff = {r.eps_eff:.3f}")

# Differential pair
d = lineforge.edge_coupled_diff(
    W="4mil", S="6mil", H="4mil",
    T="1.4mil", er=4.4, on="microstrip"
)
print(f"Zdiff = {d.z_diff:.2f} Ω")

CLI

lineforge solve --type microstrip \
  --W 6mil --H 4mil --T 1.4mil --er 4.4

# JSON output for piping to jq, csv tools
lineforge solve --type microstrip \
  --W 6mil --H 4mil --T 1.4mil --er 4.4 \
  --output json | jq '.z0'

# Run an atlc2 script unchanged
lineforge run-script my_atlc2_script.txt

# Optimize for a target Z0
lineforge optimize --type microstrip \
  --target z0=50 --vary W=0.5mil:30mil \
  --fixed H=4mil,T=1.4mil,er=4.4

MCP (Claude Desktop, Cursor, any MCP client)

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "lineforge": { "command": "lineforge", "args": ["mcp-serve"] }
  }
}

Then ask your assistant in plain English:

"What's the differential impedance of a 4 mil/6 mil edge-coupled diff pair on 4 mil FR4?"

The agent will call calculate_impedance with the right geometry and report the result. For arbitrary cross-sections, ask it to upload a bitmap (import_usermap) and run solve_cgp (returns immediately with a taskId; polled via tasks_get per SEP-1686).

See docs/MCP_VERIFICATION.md for the full end-to-end verification procedure.

Web GUI (lineforge gui)

A chat-driven design studio that wraps the same library. FastAPI + Next.js backed by claude-agent-sdk. The agent fills in your geometry form, runs the solver, and renders V/E/D/T field plots live as you converse with it.

lineforge GUI showing a microstrip Calculate Z₀ result with hero impedance card, grouped distributed-parameter sections, and an E-field plot

pip install -e ".[gui]"        # one-time, from a clone: fastapi, uvicorn, claude-agent-sdk, scikit-rf, …
lineforge gui                  # launch the local web GUI (dev mode, hot reload)
lineforge gui --prod           # production-local mode (no hot reload, prebuilt frontend)
lineforge gui --no-browser     # headless / SSH boxes: print the URL instead of opening it

lineforge gui auto-bumps the backend (8000) and frontend (3000) ports if either is busy, polls /api/health until the backend is ready, then opens the browser. Both processes' stdout streams to the terminal with colored [api] / [web] prefixes; Ctrl-C sends SIGTERM to both and SIGKILL after a 3-second grace.

Type the geometry into the chat, watch the form fill in, results update, and field plots stream in. Agent credentials come from ANTHROPIC_API_KEY (or CLAUDE_API_KEY), or from a local claude /login session. No env vars needed in the second case. Set ATLC3_GUI_CHAT_STUB=1 to use the echo handler for offline / CI testing.

The backend is the importable subpackage lineforge.web (lineforge.web.app:app is the uvicorn target). The frontend lives at <repo>/frontend/; pnpm install runs automatically the first time you launch.


What it solves

Standard PCB geometries (closed-form, microsecond-fast)

Geometry Inputs Solver
Microstrip W, H, T, εr Hammerstad-Jensen (1980)
Embedded (coated) microstrip W, H, H₂, T, εr, εr₂ IPC-2141A coated-microstrip blend
Symmetric stripline W, T, B, εr IPC-2141A / Cohn (1954)
Asymmetric stripline W, T, H₁, H₂, εr IPC-2141A harmonic-mean H
CPWG (grounded coplanar) W, S, H, T, εr Wen (1969) elliptic integrals
Edge-coupled diff microstrip W, S, H, T, εr IPC-2141A coupling correction
Edge-coupled diff stripline W, S, B, T, εr IPC-2141A coupling correction
Broadside-coupled diff stripline W, H₁, H_between, T, εr Wadell §6.5

Arbitrary cross-sections (bitmap solver)

For anything that doesn't fit a standard parameterization: irregular shapes, multi-conductor, custom dielectrics, designer-drawn cross-sections. Use the bitmap solver:

um = lineforge.from_bmp("my_geometry.bmp", pixel_width="0.1mm")
result = lineforge.solve_cgp(um, frequency="1GHz")           # C and Gp
rlgc   = lineforge.solve_full(um, frequency="1GHz")          # full RLGC

The solver accepts atlc/atlc2-format BMPs unchanged: same color encoding, same MoreColors.txt material file format. atlc2's .txt script files also run via lineforge run-script script.txt.


Accuracy

lineforge is validated at every layer. The numbers below come from the live test suite (203 passing tests; run pytest to reproduce).

Closed-form solvers

Geometry Reference Tolerance
Microstrip Z₀ scikit-rf MLine ±5%
Microstrip Z₀ IPC-2141A "rule of thumb" 50Ω cases ±10%
Stripline Z₀ IPC-2141A reference ±10–15%
CPWG Z₀ Wen (1969) formula ±15–20%¹
Diff-pair Zodd IPC-2141A coupling ±15%²

¹ CPWG closed-form genuinely differs across textbooks (Wen, Polar SI9000, Saturn). For tighter tolerance use the bitmap solver.

² IPC-2141A's diff-pair coupling is empirical and loses accuracy for tightly-coupled pairs (S/H < 0.5). For exact, use Phase 4's solve_modes(usermap) direct odd/even-mode bitmap solve.

Bitmap solvers

Geometry Quantity Reference Tolerance
Air coax (50Ω) Z₀, L, C (η₀/2π)·ln(b/a) · μ₀·ε₀ closed forms ±10%
Air coax (75Ω) Z₀ (η₀/2π)·ln(b/a) ±10%
Air coax DC L (Faraday) (μ₀/2π)·ln(b/a) ±20%
Wire pair (300Ω) DC L (Faraday) (μ₀/π)·acosh(D/2a) ±25%

The "live" test against atlc/atlc2 BMP fixtures is tracked in #10. Once added, that closes the last gap to 10/10.

Numerical pipeline

                   ┌─────────────────────────────────────────┐
   Geometry/BMP    │  Charge-shift E-prediction (~20 iters)  │   Initial V field
        │          │  (atlc2 §"C and Gp")                    │       │
        ▼          └─────────────────────────────────────────┘       ▼
   ┌──────────┐    ┌─────────────────────────────────────────┐  ┌──────────┐
   │  εr map  │ ─▶ │  5-pt FD Laplace, εr-weighted stencil   │ ─▶│  V field │
   └──────────┘    │  SOR (ω=1.9) or PyAMG smoothed-aggreg.  │  └──────────┘
                   └─────────────────────────────────────────┘       │
                                                                      ▼
                   ┌──────────────────────────────────────────────────────┐
                   │ C  = ε₀/V² · ∫εr·|E|² dA                             │
                   │ Gp = ω·ε₀/V² · ∫εr·tanδ·|E|² dA                      │
                   │ L  = μ₀·ε₀ / C_vacuum (re-solve with εr=1)           │
                   │ Z₀ = √(L/C),  vp = c/√εeff                           │
                   └──────────────────────────────────────────────────────┘

For L and Rs at finite frequency, lineforge builds a 2D PEEC sparse system (one row per conductor pixel) and solves it with scipy.sparse.linalg.bicgstab

  • ILU0 preconditioner. Skin-depth restriction (atlc2 "Restrict to skin depth") blackens conductor pixels deeper than 3δ from the surface, collapsing the equation count at high frequency.

Full theory in docs/theory/.


Architecture

┌──────────────────────────────────────────────────────────────────┐
│  Layer 3: User-facing surfaces (all polished day 1)              │
│  ┌────────────────┐  ┌──────────────────┐  ┌──────────────────┐ │
│  │  MCP server    │  │  CLI: lineforge      │  │  Python API:     │ │
│  │  (MCP SDK,     │  │  (Typer + Rich,  │  │  import lineforge    │ │
│  │   SEP-1686     │  │   batch + serve) │  │  Pydantic models │ │
│  │   Tasks)       │  │                  │  │                  │ │
│  └────────────────┘  └──────────────────┘  └──────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
                              │
┌──────────────────────────────────────────────────────────────────┐
│  Layer 2: Solver orchestration (Python)                          │
│  • Geometry builders (microstrip / stripline / CPWG / …)         │
│  • Material database (atlc2's 45 colors + MoreColors.txt parser  │
│    + JSON material packs)                                        │
│  • Solver dispatcher (analytical fast-path → numerical fallback) │
│  • Open-boundary grid extension for unshielded geometries        │
│  • Result post-processing, field rendering, sweep / optimize     │
│  • atlc2 .txt script-file interpreter                            │
│  • Disk-cached results (JSON, ATLC3_NO_CACHE=1 to disable)       │
└──────────────────────────────────────────────────────────────────┘
                              │
┌──────────────────────────────────────────────────────────────────┐
│  Layer 1: Numerical kernels                                      │
│  ┌────────────────────────┐  ┌────────────────────────────────┐ │
│  │ Pure-Python (analytic) │  │ Numerical (NumPy/SciPy/PyAMG)  │ │
│  │ • Hammerstad-Jensen    │  │ • SOR + multigrid (Laplace)    │ │
│  │ • Wadell formulas      │  │ • Charge-shift E-prediction    │ │
│  │ • Wen elliptic         │  │ • PEEC Faraday assembly        │ │
│  │ • IPC-2141A            │  │ • BiCGSTAB+ILU0 sparse solve   │ │
│  └────────────────────────┘  │ • Rust kernel slots (Phase 5)  │ │
│                              └────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘

Performance

Operation Time Notes
Closed-form microstrip Z₀ ~10 µs Hammerstad-Jensen, no solve
125×125 coax C/Gp solve ~1 s SOR, no extension
125×125 coax C/Gp cached ~0.5 ms 2,297× speedup vs cold solve
Differential pair sweep, 25 points <100 ms Closed-form, sweep API

Repeat solves of the same geometry hit the on-disk cache (key includes the package version, so upgrades cleanly retire old results). Disable globally with ATLC3_NO_CACHE=1; clear with lineforge clear-cache.


Roadmap

Phase Status Headline
0: Bootstrap Closed Repo, build, CI matrix, release pipeline
1: Analytical solvers Closed All 8 standard PCB geometries, 3 surfaces
2: Bitmap C/Gp Implemented Laplace FD, atlc2 file compat, async MCP
3: Faraday L/Rs Implemented PEEC sparse solver, skin depth, sweeps
4: Polish + 1.0 Closing Optimizer, cache, viewer, CHANGELOG, docs
5: Rust acceleration Pending Native SOR/multigrid/PEEC via PyO3

Track gaps as GitHub issues, each tagged with its phase milestone.


Documentation

Built with mkdocs-material; deploys to GitHub Pages on every push to main.


Contributing

Contributions are welcome and follow a phase-driven workflow.

  1. Pick a GitHub issue. Each is tagged with its phase milestone and AC checklist.
  2. Fork + branch (feature/your-thing or fix/your-bug).
  3. Run the local check suite:
    ruff check . && black --check . && mypy src/lineforge
    pytest --cov=lineforge
    cargo fmt --all -- --check && cargo clippy -- -D warnings
    cargo test --workspace
    
  4. Open a PR: link the issue, tick AC checkboxes, request review.

Full contributor guide in CONTRIBUTING.md. Participation is governed by the Contributor Covenant 2.1.

Where the bar is

  • ≥90% Python coverage on all new modules (current overall: ~60%, with some intentionally interactive modules at 0%).
  • mypy --strict clean on all new code.
  • Golden-value tests for every new solver. New numerical work must cite an analytical or atlc/atlc2 reference value.
  • Cross-platform: Linux + macOS + Windows × Python 3.11/3.12/3.13 in CI.

Citation

If you use lineforge in published research or designs, a citation is welcome:

@software{lineforge,
  title  = {lineforge.0: Open-Source MCP-Enabled Transmission Line Calculator},
  author = {{lineforge contributors}},
  year   = {2026},
  url    = {https://github.com/RFingAdam/lineforge},
  note   = {GPL-3.0-or-later}
}

A formal release on Zenodo lands with v1.0.0.


Part of eng-mcp-suite

This MCP server is part of

eng-mcp-suite

An open umbrella for engineering MCP servers across RF, EMC, PCB, signal integrity, EM simulation, and lab test. Same brand, same docs structure, designed to compose. Use lineforge in the rf-design or pcb-review workflow bundle. See the full catalog or jump to a sibling:

Domain Sibling MCPs
EM simulation mcp-nec2-antenna, mcp-openems
Circuit + filter sim mcp-ltspice-qucs
PCB / SI mcp-pcb-emcopilot
EMC regulatory mcp-emc-regulations
Diagrams drawio-engineering-mcp
Lab gear copper-mountain-vna-mcp

Lineage

lineforge was originally released as atlc3 (1.0.0 / 1.1.0, April-May 2026). It was renamed to lineforge at v2.0.0 to reflect the broader scope. The project has grown well past being a "successor to atlc/atlc2" into a programmable, agent-friendly platform with MCP, Touchstone export, optimizer, frequency sweeps, multi-layer stacks, GUI, and a three-conductor solver.

The atlc lineage is real and we honor it: lineforge references and is partially derived from David Kirkby's atlc v1 (GPL), and the bitmap solver maintains drop-in BMP/MoreColors/.txt script compatibility with Brian Beezley's atlc2 based on its publicly documented behavior at http://www.hdtvprimer.com/kq6qv/atlc2.html.

If you used atlc3 1.x previously: atlc3 is frozen at the v1.1.0 tag and was never published to PyPI. For new work, use lineforge. The Python API is unchanged in name shapes: just rename your import atlc3 to import lineforge.

License

AGPLv3. Relicensed from GPLv3 in v2.2.0 to close the "wrap as a paid SaaS without contributing back" gap; the atlc / atlc2 lineage is preserved and the GPL -> AGPL move is explicitly permitted by GPL-3.0 section 13.

Brand assets

The project name and the logo files in this repository are not part of the licensed work. The licence above grants no permission to use them, except as needed to describe the origin of the work.

Acknowledgments

  • Dr. David Kirkby (G8WRB): original atlc (2002, GPL).
  • Brian Beezley (KQ6QV): atlc2 (2010), the comprehensive documented spec we built behavioral compatibility against.
  • scikit-rf, PyAMG, scipy.sparse. The open-source numerical libraries that make this possible.
  • MCP Python SDK, Typer, Pydantic, maturin. The modern Python toolchain underneath the three user surfaces.
  • openEMS: independent 3D FDTD reference used to cross-validate the closed-form solvers; see examples/09_l3_sig1_em_validation/.
  • The MCP working group: for the Tasks SEP-1686 spec that made the async-solver pattern clean.

Built for PCB designers, RF engineers, and AI agents.

Metadata

Release files for lineforge 2.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lineforge 2.3.0
File Size Uploaded Provenance Actions
lineforge-2.3.0.tar.gz 188.2 kB With provenance Details for lineforge-2.3.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for lineforge 2.3.0
File Actions
lineforge-2.3.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details for lineforge-2.3.0-cp311-abi3-win_amd64.whl
lineforge-2.3.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.11 abi3 Linux glibc 2.17+ x86-64 Details for lineforge-2.3.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
lineforge-2.3.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl CPython 3.11 abi3 Linux glibc 2.17+ ARM64 Details for lineforge-2.3.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
lineforge-2.3.0-cp311-abi3-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 10.12+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64, macOS 10.12+ x86-64 Details for lineforge-2.3.0-cp311-abi3-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl

Total release size: 2.0 MB

Release files / lineforge-2.3.0.tar.gz

Download URL lineforge-2.3.0.tar.gz
Size 188.2 kB
Tags Source
SHA-256 checksum
How to use checksums
15cfd1355514cfdd0860abb85eadf169f459f4deacce385df3b8a4dd4e7d0c72
BLAKE2b-256 checksum
How to use checksums
dee638ae1def793c4a870188d8f4c9084122be57578aae5c72d23f36987a825d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / lineforge-2.3.0-cp311-abi3-win_amd64.whl

Download URL lineforge-2.3.0-cp311-abi3-win_amd64.whl
Size 309.8 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
418165f8c37b94043c1a1ec658084406916c1fa527b6b2d422398f1c2c6a1a15
BLAKE2b-256 checksum
How to use checksums
8ee3ff5ee9a0382c6c5254e85f0a96b74f61958cf8bb73a2d52d489c712cd0e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / lineforge-2.3.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL lineforge-2.3.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 427.8 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
7c5717a5f9466bd0368db1c542c1cdf5e3e59371ea3308ed7cb0996d1947a2e3
BLAKE2b-256 checksum
How to use checksums
328a0769b8675f3548bdb10de03f1b686f57def3338ccef4d769af92a94e7c55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / lineforge-2.3.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL lineforge-2.3.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 428.7 kB
Tags CPython 3.11 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
fe0f68bd8dd789e5080203c9525b93a41a97da23515b0ce03c6485af0d5c8def
BLAKE2b-256 checksum
How to use checksums
904d5fa0f18d61bbef41f6ebe1fa5ea7c143888796c2f8744ffc398e9e387a66
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / lineforge-2.3.0-cp311-abi3-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl

Download URL lineforge-2.3.0-cp311-abi3-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64.whl
Size 596.6 kB
Tags CPython 3.11 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
44e60321bb02fa35de1ec6389bd596466b3c46019b3ff6d0b290115a1ad664a1
BLAKE2b-256 checksum
How to use checksums
8ba6cd59f1c3f06bb31bea276d3607d730ac908be916bb8c8045e2d68163eefe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Security for lineforge 2.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 5 files in this release have been uploaded with provenance metadata.

Select from 5 files

Attestation for lineforge-2.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

2.3.0 This release

5 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page