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.txtfiles, and.txtscript files run unchanged via the bitmap solver. New.lineforge.jsonis 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 {
"mcpServers": {
"lineforge": { "command": "lineforge", "args": ["mcp-serve"] }
}
}
Then ask your assistant in plain English:
The agent will call See |
|
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.
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
- Quick Start. Three-minute path from
pip installto your first impedance answer. - Python API tutorial
- CLI tutorial
- MCP server tutorial + verification procedure
- Geometry reference. Every supported geometry with its dimensional fields and JSON Schema.
- Theory pages: analytical formulas · Laplace solver · Faraday solver · skin effect · 3-wire decomposition
- Implementation plan + audit report: what shipped vs what remains.
- Changelog
Built with mkdocs-material;
deploys to GitHub Pages on every push to main.
Contributing
Contributions are welcome and follow a phase-driven workflow.
- Pick a GitHub issue. Each is tagged with its phase milestone and AC checklist.
- Fork + branch (
feature/your-thingorfix/your-bug). - 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
- 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 --strictclean 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
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)
| 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)
| File | Actions Reset | |||
|---|---|---|---|---|
| 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 11.0+ ARM64, macOS 10.12+ x86-64, macOS 10.12+ universal2 (ARM64, 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logSecurity 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.
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 logA 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.