linceo
A DevSecOps tool orchestrator: it runs one or more security tools against a
workspace, normalizes their output into a single Finding model, and
produces one verdict — one exit code — for the entire run, instead of one
report per tool that a pipeline has to reconcile by hand.
The full architecture and scope of the current version are recorded in
docs/adr/ADR-000-arquitectura-base-y-alcance-v0.1.md.
That document is the contract for this project; anything below is a summary
of it, not a replacement.
Status
Pre-release (0.1.0.dev0). The engine, both v0.1 reference tool
integrations (Gitleaks, Trivy), both reference context providers (local,
azure_devops), console/JSON/SARIF reporting, the doctor command, and
the reference container image are in place. See the ADR's build order for
what ships next.
Non-negotiable constraints
- Runs the same way regardless of which CI platform invokes it.
- The happy path makes no network call.
- No shared state or backend of its own: one run is one self-contained execution.
- The container image is the primary distribution unit; PyPI supports local development, bring-your-own tool binaries.
- No client-specific configuration ever lives in this repository.
Installation
Container image (primary distribution, ADR §4/R4)
The container image is the unit of compatibility between the orchestrator and the exact tool versions it invokes: it bundles pinned, checksum-verified builds of Gitleaks and Trivy, plus Trivy's vulnerability database pre-fetched at build time, so a scan runs fully offline by default.
Pull a published release — built and pushed by
.github/workflows/release.yml, no
authentication needed (see docs/RELEASING.md):
docker pull ghcr.io/jdiegoisaza/linceo:latest # or a specific version, e.g. :0.2.0
Run it against a workspace by mounting it and appending a subcommand —
exactly as you would to the linceo binary itself:
docker run --rm -v "$PWD:/workspace" ghcr.io/jdiegoisaza/linceo scan secrets
docker run --rm -v "$PWD:/workspace" ghcr.io/jdiegoisaza/linceo scan sca --fail-on high
docker run --rm ghcr.io/jdiegoisaza/linceo doctor
docker run --rm ghcr.io/jdiegoisaza/linceo alone (no subcommand) prints
--help. The image runs as a fixed non-root user (uid/gid 1000); if the
mounted workspace's files are owned by a different uid on the host, add
--user "$(id -u):$(id -g)" to the docker run invocation.
To build it yourself instead — for local development, or to reproduce a published image bit-for-bit from source — from the repository root:
docker build \
--build-arg BUILD_DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--build-arg VCS_REF="$(git rev-parse HEAD)" \
-t linceo:local .
(swap ghcr.io/jdiegoisaza/linceo for linceo:local in the docker run
examples above). Omitting LINCEO_VERSION here is expected for a local
build — it's the release workflow that passes the real one; see
docs/RELEASING.md, "Container image".
Which exact versions of Gitleaks and Trivy — and how old its vulnerability
database is — a given image carries is queryable two ways, and both
describe the same pinned reality (see Dockerfile and
src/linceo/cli/doctor.py):
- Without starting the container:
docker inspect ghcr.io/jdiegoisaza/linceo:latest(orlinceo:local, orskopeo inspectagainst any pushed image) shows the OCI labels the build embeds —dev.linceo.tool.gitleaks.version,dev.linceo.tool.trivy.version,dev.linceo.trivy-db.built-at, plus the standardorg.opencontainers.image.*set. - From inside it:
linceo doctor(see below) — the same command works identically for apip installed, bring-your-own-tool setup.
pip install (local development, bring-your-own tool binaries)
pip install linceo
Requires Python 3.11 or later. Gitleaks and Trivy are not bundled via
PyPI — install them yourself and run linceo doctor to confirm each one
is on PATH, at a compatible version, and (for Trivy) how old its
vulnerability database is; a missing or incompatible tool gets an
actionable install/upgrade hint printed right there.
Development
uv sync
uv run linceo --version
See CONTRIBUTING.md for the full set of task commands,
and AGENTS.md for repository conventions and hard rules.
License
Release files for linceo 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| linceo-0.1.2.tar.gz | 284.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| linceo-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 403.8 kB
Release files / linceo-0.1.2.tar.gz
| Download URL | linceo-0.1.2.tar.gz |
|---|---|
| Size | 284.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
972d524fbd4d2ecf8480b5a57b474a308c0328324fb10cb60f99585fedb6d619
|
|
BLAKE2b-256 checksum How to use checksums |
12c6a92175f5bfc44e207b5e30ee50d344ba6796afb2470900d8c9c5be9ef19b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 18, 2026.
Transparency logRelease files / linceo-0.1.2-py3-none-any.whl
| Download URL | linceo-0.1.2-py3-none-any.whl |
|---|---|
| Size | 119.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
912d6ec70a58421cd9b819da6f5ea1c4c9d00cf730efc13f9bf0678f352926ec
|
|
BLAKE2b-256 checksum How to use checksums |
0d921962983f67658b31621cd41276bf71db9d37e2d94410dc15882109aa7c27
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 18, 2026.
Transparency log