Skip to main content

askwol

Check OWL ontologies during modelling and before publication. Get a report on namespaces, terms, metadata, documentation, and selected logical issues, plus an interactive class diagram in the web app.

Licence: MIT PyPI Python Tests

Try online · Publishing guide

askwol web UI screenshot

Supported formats: Turtle (.ttl), RDF/XML (.rdf, .owl), JSON-LD (.jsonld), N-Triples (.nt), and N3 (.n3). See the full list of checks; each report section links to the matching guide entry.

Findings count individual issues, not checks:

Severity Meaning
Error A detected logical issue or violation of selected OWL restrictions.
Warning A likely mistake or interoperability problem.
Recommendation A publishing convention, such as metadata, licensing, or documentation.

Reasoning uses the submitted document without imports. Passing these checks does not establish overall consistency or complete OWL conformance.

Install

Python 3.10+ is required. For the CLI only, install with pipx:

pipx install askwol

For local development, the web app, and the Python API (macOS/Linux):

git clone https://github.com/TDCC-NES/askwol.git
cd askwol
python3 -m venv .venv
.venv/bin/python -m pip install -e ".[dev]"

Run locally

Run from the repository folder containing pyproject.toml, using the virtual environment above:

ASKWOL_ROOT_PATH= PYTHONPATH=src .venv/bin/python -m uvicorn \
  askwol.web:app --reload --reload-dir src --port 8000

Open the checker, guide, or API docs. Python changes reload automatically; refresh the browser to see them. Stop with Ctrl+C.

CLI

askwol check ontology.ttl
askwol check ontology.ttl --format json
askwol check ontology.ttl --format markdown -o report.md
askwol check ontology.ttl --skip-resolution

For a source install, use .venv/bin/askwol instead of askwol.

  • --timeout 60 sets the HTTP timeout in seconds (default: 30).
  • --skip-resolution skips namespace and import HTTP requests; local checks and reasoning still run.
  • Exit code 0 means no errors; 1 means errors were found. Warnings and recommendations do not change the exit code.

API

Upload a file to the running app for a JSON report:

curl -F "file=@ontology.ttl" http://127.0.0.1:8000/api/validate

JSON includes severity_summary with finding counts and has_errors. Per-check status values (ok, warn, fail, skip) describe outcomes, not severity. /health reports service availability.

To run the same checks from Python:

import asyncio
from askwol.pipeline import run_full_validation

report, _ = asyncio.run(run_full_validation("ontology.ttl", include_mermaid=False))
print(report.model_dump_json(indent=2))

Docker

From the repository root, build and start the app, or rebuild after changes:

docker compose up -d --build --force-recreate

The app is available at http://127.0.0.1:8000/. Logs: docker compose logs -f askwol. Stop: docker compose down.

For automatic reloading during development:

cp docker-compose.override.yml.example docker-compose.override.yml
docker compose up --build

Keep that development override off production servers. The supplied production configuration uses one web worker, binds to 127.0.0.1:8000, and persists usage data in ./data/.

On a server, clone the repository, run the start command above, and put an HTTPS reverse proxy in front of it. For example, with Caddy:

askwol.example.com {
    encode zstd gzip
    request_body { max_size 25MB }
    reverse_proxy 127.0.0.1:8000
}

For updates, run git pull, then repeat the build/start command.

Serving under a sub-path

For a deployment at /askwol/, put this in the repository's .env file:

ASKWOL_ROOT_PATH=/askwol

The reverse proxy must strip the prefix before forwarding. With Caddy:

server.example.com {
    handle_path /askwol/* {
        reverse_proxy 127.0.0.1:8000
    }
}

Configuration

Native Python runs read environment variables, not .env files. Docker Compose forwards ASKWOL_ROOT_PATH and ASKWOL_STATS_TOKEN from .env; add other overrides under the service's environment in a Compose override file. Restart native runs or recreate Compose containers after changing settings.

Variable Default Purpose
ASKWOL_RATE_LIMIT 20 Validation requests per client IP per minute, per worker; 0 disables.
ASKWOL_VALIDATION_TIMEOUT 300 Maximum seconds per web job.
ASKWOL_MAX_CONCURRENT_VALIDATIONS 2 Concurrent web jobs per worker.
ASKWOL_MAX_TRIPLES 500000 Maximum triples per ontology.
ASKWOL_MAX_NAMESPACES 500 Maximum declared prefixes per ontology.
ASKWOL_MAX_IMPORTS 200 Maximum declared imports per ontology.
ASKWOL_USAGE_DB data/usage.db Usage database path; Docker uses /data/usage.db.
ASKWOL_USAGE_DISABLED unset Set to 1 to disable usage tracking.
ASKWOL_STATS_TOKEN unset Enables access to usage statistics.

Web uploads are capped at 20 MB. Requests to private/internal network addresses are blocked. Web jobs run in isolated subprocesses: timeouts return 504, and excess concurrent requests return 503. Set the proxy timeout above the job timeout and enforce a proxy upload limit. The CLI shares the ontology size caps, but runs without the web job timeout or concurrency limit.

A client disconnect cancels its job when the reverse proxy forwards the disconnect. Cancelled requests do not count as usage.

Usage tracking

A local SQLite database records timestamps, source URLs or filenames, HTTP statuses, durations, and IP hashes salted with a per-database secret. No cookies or third-party tracking services are used.

Set ASKWOL_STATS_TOKEN to a long random value (generate one with openssl rand -hex 32) and apply it as described above. /stats is the HTML dashboard; /api/stats returns JSON. Authenticate with ?token=YOUR_TOKEN, including on localhost. Totals and daily counts cover all recorded activity; average duration uses the last 30 days.

Tests

After the source installation above, run from the repository root:

.venv/bin/python -m pytest tests/ -q

For manual checks, upload sample.ttl or broken.ttl through the local app. Contribution guidelines: CONTRIBUTING.md.

Why askwol?

The name plays on OWL and “Wol,” Owl's misspelled name in Winnie-the-Pooh: ask Owl for a second opinion on your ontology. Wollie, to friends.

Licence

MIT.

Metadata

Release files for askwol 0.2.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 askwol 0.2.0
File Size Uploaded
askwol-0.2.0.tar.gz 961.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for askwol 0.2.0
File Interpreter ABI Platform
askwol-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.2 MB

Release files / askwol-0.2.0.tar.gz

Download URL askwol-0.2.0.tar.gz
Size 961.2 kB
Tags Source
SHA-256 checksum
How to use checksums
64ee2e0a0e01883f9f3ebdeac979660d877be625c526aed49b8fdb562ff91467
BLAKE2b-256 checksum
How to use checksums
aa3c50fa99b9726a797549017254447e9ad71a05af56354c10d699b0b0bce3f9
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 Oct 15, 2026.

Transparency log

Release files / askwol-0.2.0-py3-none-any.whl

Download URL askwol-0.2.0-py3-none-any.whl
Size 223.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7449c77047d732c88e3079eafbc3cae2722890273e4334cba8010f276fed829d
BLAKE2b-256 checksum
How to use checksums
870885f9b3238a2d7d66895ef413cee58e78c026de5b30936e2d8fd079f98d7f
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 Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

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