{"id":50687850,"url":"https://github.com/ohswedd/aura-connector","last_synced_at":"2026-06-11T02:01:36.199Z","repository":{"id":362505086,"uuid":"1259380314","full_name":"Ohswedd/aura-connector","owner":"Ohswedd","description":"Async-native, type-safe Python client and connector for AuraDB: typed models, an injection-safe query builder, first-class vector fields, a deterministic binary protocol, migrations, observability, and optional native acceleration.","archived":false,"fork":false,"pushed_at":"2026-06-09T19:05:05.000Z","size":399,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T01:14:08.453Z","etag":null,"topics":["async","asyncio","auradb","connector","database","database-client","orm","pyo3","python","query-builder","rust","type-safe","typed","vector-database","vector-search"],"latest_commit_sha":null,"homepage":"https://github.com/Ohswedd/aura-connector","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ohswedd.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-04T12:58:42.000Z","updated_at":"2026-06-09T19:08:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"27f48a3c-a74f-40d1-bdb0-d0de2a4e5372","html_url":"https://github.com/Ohswedd/aura-connector","commit_stats":null,"previous_names":["ohswedd/aura-connector"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/Ohswedd/aura-connector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ohswedd%2Faura-connector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ohswedd%2Faura-connector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ohswedd%2Faura-connector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ohswedd%2Faura-connector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ohswedd","download_url":"https://codeload.github.com/Ohswedd/aura-connector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ohswedd%2Faura-connector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34178819,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","asyncio","auradb","connector","database","database-client","orm","pyo3","python","query-builder","rust","type-safe","typed","vector-database","vector-search"],"created_at":"2026-06-09T00:30:32.750Z","updated_at":"2026-06-11T02:01:36.187Z","avatar_url":"https://github.com/Ohswedd.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Aura Connector\n\n**A typed async Python connector and query layer for AuraDB.**\n\n[![CI](https://github.com/Ohswedd/aura-connector/actions/workflows/ci.yml/badge.svg)](https://github.com/Ohswedd/aura-connector/actions/workflows/ci.yml)\n[![Native](https://github.com/Ohswedd/aura-connector/actions/workflows/native.yml/badge.svg)](https://github.com/Ohswedd/aura-connector/actions/workflows/native.yml)\n[![PyPI](https://img.shields.io/pypi/v/aura-connector.svg)](https://pypi.org/project/aura-connector/)\n[![Python](https://img.shields.io/pypi/pyversions/aura-connector.svg)](https://pypi.org/project/aura-connector/)\n[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)\n[![Typed](https://img.shields.io/badge/typed-mypy%20strict-blue.svg)](https://mypy-lang.org/)\n[![Ruff](https://img.shields.io/badge/lint-ruff-261230.svg)](https://github.com/astral-sh/ruff)\n\n\u003c/div\u003e\n\nAura Connector is an async, typed Python client for [**AuraDB**](https://github.com/Ohswedd/auradb)\nand a uniform query layer over the databases you already run. Declare typed models once,\ncompose injection-safe queries with a fluent builder, and run them against AuraDB or another\nbackend by changing only the DSN. AuraDB is the native, high-performance target over the Aura\nWire Protocol; the other backends make the same model and query API useful immediately on\nexisting infrastructure.\n\n**Aura Connector v0.8.0 is the matching client for AuraDB v1.4.0**, carrying forward the full\nv0.7.x feature set (group-by aggregation, the opt-in HNSW preview options with an\n`\"exact\"`/`\"error\"` fallback policy, the best-effort query profile, public ranked-search cursor\nresume) over the v1.1–v1.3 search, ranking, and query-ergonomics surface. v0.8.0 adds purely\n**client-side ergonomics**, with no wire-protocol change: **connection profiles**\n(`ConnectionProfile`, `ConnectionProfile.from_env`, `Client.from_profile` /\n`Aura.from_profile`, TLS CA and SNI/`server_name` wiring, and a token-redacting `repr`),\n**search-eval report parsing helpers** (`SearchEvalReport` / `SearchEvalMetrics` /\n`SearchEvalQueryResult` and the BM25/hybrid report models, which parse `auradb search eval`\nCLI output and do **not** run server-side CLI commands), and **capability require/describe\nhelpers**. Each AuraDB feature is gated on a capability the backend negotiates at handshake.\nFeature differences between backends are honest: search/ranking APIs require AuraDB\ncapabilities, and a backend that does not support a requested feature raises a structured\ncapability error instead of pretending to support it.\n\nIt is useful today with zero setup — the package ships an in-memory reference backend and\nfirst-class SQLite, so the examples and the full default test suite run with no external\ndatabase and no compiler.\n\n```python\nimport asyncio\nfrom aura import Aura, Model, Field, Vector\n\n\nclass Document(Model):\n    id: int = Field(primary_key=True)\n    title: str\n    body: str\n    embedding: Vector[3]\n\n\nasync def main() -\u003e None:\n    async with Aura.connect(\"aura+memory://localhost/app\", models=[Document]) as client:\n        await client.insert(Document(id=1, title=\"Refunds\", body=\"...\", embedding=[1, 0, 0]))\n\n        # Typed, injection-safe query building.\n        docs = await (\n            client.query(Document)\n            .where(Document.title.contains(\"Refund\"))\n            .order_by(Document.id.desc())\n            .limit(10)\n            .all()\n        )\n\n        # Exact vector nearest-neighbour search.\n        matches = await (\n            client.search(Document)\n            .nearest(Document.embedding, [1, 0, 0], metric=\"cosine\")\n            .limit(5)\n            .all()\n        )\n        print(docs, matches)\n\n\nasyncio.run(main())\n```\n\n## Why it matters\n\nPython data access usually forces a trade: ORMs give typed models but hide the wire and leak\nlazy queries; raw drivers give control but hand back untyped tuples and string SQL; vector\nsearch lives in yet another SDK. Aura Connector unifies these behind one typed async client.\n\n- **One typed client** for relational, document, vector, hybrid, and graph access.\n- **Async-first.** `asyncio` is the primary execution model, not a wrapper.\n- **Explicit relationship loading.** No hidden lazy network IO — `.include()` is required, and\n  accessing an unloaded relationship raises a clear error.\n- **Injection-safe by construction.** Queries compile to an immutable AST and Query IR, never\n  to concatenated strings.\n- **Honest about backends.** Unsupported features raise a structured error rather than being\n  silently emulated.\n\n## Install\n\nThe base install is dependency-free and includes the AuraDB protocol and in-memory backends.\nAdd an extra for each database backend you want:\n\n```bash\npip install aura-connector                 # core: AuraDB protocol + in-memory backend\npip install \"aura-connector[sqlite]\"       # SQLite        (aiosqlite)\npip install \"aura-connector[postgres]\"     # PostgreSQL    (asyncpg)\npip install \"aura-connector[mysql]\"        # MySQL/MariaDB (aiomysql)\npip install \"aura-connector[mongodb]\"      # MongoDB       (motor)\npip install \"aura-connector[redis]\"        # Redis         (redis.asyncio)\npip install \"aura-connector[sql]\"          # SQLite + PostgreSQL + MySQL\npip install \"aura-connector[all-db]\"       # every database driver\npip install \"aura-connector[native]\"       # + optional native acceleration tooling\n```\n\nSelecting a backend whose driver is not installed raises `AuraDriverNotInstalledError` with\nthe exact install command. Requires Python 3.11+; the pure-Python path needs no compiler. The\nimport package is `aura`. Optional native acceleration (CRC32 and f32 vector packing) is\nbuilt with maturin from `crates/aura_native` — see\n[Native acceleration](docs/NATIVE_ACCELERATION.md).\n\n## Compatibility\n\nThe connector reads the connected backend's advertised capabilities at handshake, so it\nadapts to the server version rather than assuming one.\n\n| Aura Connector | AuraDB server | Protocol | Status |\n| -------------- | ------------- | -------- | ------ |\n| **0.5.x** | **1.1.x** | AWP 1 | Recommended — first-class search and ranking (`search_text` BM25, `search_vector`, `search_hybrid`), typed scores, capability negotiation. |\n| 0.5.x | 1.0.x | AWP 1 | Basic operations supported. Search APIs raise `AuraCapabilityError` because a pre-1.1.0 server does not advertise BM25/hybrid. |\n| 0.4.x | 0.7.x / 1.0.x / 1.1.x | AWP 1 | Older line — CRUD, transactions, exact vector, and cluster-preview ergonomics; predates the search APIs. |\n| 0.3.x | 0.2.x+ | AWP 1 | Native AuraDB backend (auth + TLS); no typed `not_leader` ergonomics. |\n| 0.2.x | — | n/a | Not compatible with the authenticated, TLS-capable native backend. |\n\nThe search clauses are additive Query IR, so AWP 1 is unchanged across these rows. See\n[docs/COMPATIBILITY.md](docs/COMPATIBILITY.md).\n\n## Quick start\n\nThe fastest start needs no external service — SQLite (local) or the in-memory engine. Switch\nto AuraDB or another database by changing only the DSN.\n\n```python\nimport asyncio\nfrom aura import Aura, Model, Field\n\nclass User(Model):\n    id: int = Field(primary_key=True)\n    email: str = Field(unique=True, index=True)\n    display_name: str | None = Field(default=None)\n\nasync def main() -\u003e None:\n    async with Aura.connect(\"sqlite:///app.db\", models=[User]) as db:\n        await db.insert(User(id=1, email=\"ada@example.com\", display_name=\"Ada\"))\n        ada = await db.User.find(id=1)\n        print(ada.display_name)\n\nasyncio.run(main())\n```\n\nThe same code runs against other backends by changing only the DSN:\n\n```python\nasync with Aura.connect(\"postgresql://user:pass@localhost:5432/app\", models=[User]) as db: ...\nasync with Aura.connect(\"mongodb://localhost:27017/app\", models=[User]) as db: ...\nasync with Aura.connect(\"auras://db.example.com:7171/app\", models=[User]) as db: ...   # AuraDB over TLS\n```\n\nSee [Getting started](docs/GETTING_STARTED.md), [Models](docs/MODELS.md), and the\n[Query builder](docs/QUERY_BUILDER.md).\n\n## AuraDB native backend\n\nThe `auradb://` (plaintext) and `auradbs://` (TLS) schemes connect to a running AuraDB server\nover Aura Wire Protocol 1, including static-token authentication, TLS, and transactions with\nread-your-writes. AuraDB v1.2.0 is the current coordinated server; the native backend speaks\nAWP 1, which is frozen for the AuraDB v1 line.\n\n```python\nfrom aura import connect\nfrom aura.config import TokenAuth, TLSConfig\n\nasync with connect(\n    \"auradbs://db.example.com:7171/app\",\n    models=[User],\n    auth=TokenAuth(\"my-secret-token\"),\n    tls=TLSConfig(enabled=True, ca_cert_path=\"/etc/aura/ca.pem\"),\n) as client:\n    async with client.transaction() as tx:\n        await tx.insert(User(id=1, email=\"ada@example.com\"))\n        # Read-your-writes: visible inside the transaction, not outside until commit.\n        assert await tx.query(User).where(User.id == 1).count() == 1\n```\n\nA certificate the CA does not validate, or a hostname mismatch, fails the handshake — the\nclient never silently downgrades to plaintext. The legacy `aura://` / `memory://` schemes use\nthe connector's bundled reference protocol path, not the AuraDB network server. See\n[docs/AURADB.md](docs/AURADB.md).\n\n**Connection profiles (v0.8.0).** For deployments that configure connections from the\nenvironment, `ConnectionProfile.from_env()` reads `AURA_ADDR` plus optional auth/TLS/timeout/\nisolation variables into a typed, immutable profile (auth token redacted from `repr`), and\n`Aura.from_profile(profile)` opens a client. It resolves through the same `parse_dsn` path, so\nit adds no new connection behaviour — and it is a convenience helper, **not** a secret manager.\nSee `examples/auradb_connection_profile.py`.\n\n## Search and ranking\n\nAgainst AuraDB v1.1.x and later (and the in-memory reference backend), the connector exposes\nfirst-class ranked search. Exact vector search is the default and correctness baseline;\nagainst AuraDB v1.2.0+ the connector can opt a vector query into the approximate (HNSW)\npreview (`search_vector(..., approximate=True)`, or `HnswOptions(...)` for tuned parameters\nand an `\"exact\"`/`\"error\"` fallback policy) — not large-scale ANN.\n\n```python\nfrom aura import HnswOptions, search_scores\n\n# Ranked full-text (BM25).\nrows = await client.search(Doc).search_text(\"body\", \"vector index\", rank=\"bm25\").all()\n\n# Exact vector search.\nrows = await client.search(Doc).search_vector(\"embedding\", q, metric=\"cosine\", top_k=10).all()\n\n# Approximate (HNSW) preview with tuned parameters and a fallback policy.\nopts = HnswOptions(ef_search=64, fallback=\"exact\")\nrows = await client.search(Doc).search_vector(\"embedding\", q, top_k=10, approximate=opts).all()\n\n# Hybrid text + vector, fused.\nrows = await (\n    client.search(Doc)\n    .search_hybrid(\"body\", \"vector index\", \"embedding\", q,\n                   weights=(0.5, 0.5), fusion=\"weighted_sum\", top_k=10)\n    .all()\n)\n\nfor row in rows:\n    s = search_scores(row)\n    print(s.rank, s.score, s.text_score, s.vector_score)\n\n# Group-by aggregation, and public cursor resume from an opaque token (AuraDB v1.3.0).\nagg = await client.query(Order).group_by(\"region\").aggregate_count().aggregate()\nfor group in agg.groups.groups:\n    print(group.key, group.count)\n\nsearch = client.search(Doc).search_text(\"body\", \"raft\")\nfirst = await search.page(page_size=20)\nnxt = await client.resume_search(search, first.next_cursor, page_size=20)\n```\n\n`.explain()` on any query or search builder returns the client-side Query IR plan; the\nserver-measured plan is available through AuraDB's `auradb search explain --analyze`.\n**Search/ranking APIs require AuraDB capabilities.** The connector checks the connected\nbackend's advertised capabilities first; a backend that does not support a requested feature\nraises `AuraCapabilityError` rather than emulating it. `client.capabilities()` is the\nauthoritative source for what the connected server supports. See\n[docs/SEARCH_AND_RANKING.md](docs/SEARCH_AND_RANKING.md) and the\n[`auradb_text_search`](examples/auradb_text_search.py),\n[`auradb_hybrid_search`](examples/auradb_hybrid_search.py),\n[`auradb_explain_analyze`](examples/auradb_explain_analyze.py), and\n[`auradb_search_capabilities`](examples/auradb_search_capabilities.py) examples.\n\n**Capability UX (v0.8.0).** Beyond `capabilities().supports(flag)`, `require(flag)` raises a\nclear `AuraBackendCapabilityError` (naming the backend and missing capability) and `describe()`\nreturns supported/unsupported lists — see `examples/auradb_capabilities.py`.\n\n**Search-quality reports (v0.8.0).** AuraDB's server-side `auradb search eval` / `vector eval`\nCLIs emit JSON relevance/recall reports; `aura.search_quality` parses them into typed\n`SearchEvalReport` / `ExactAnnComparisonReport` objects. The connector only parses the CLI's\noutput — it does not run the CLI or compute relevance, and the metrics are dataset-specific\nregression signals, not universal benchmarks. See `examples/auradb_search_eval_report.py`.\n\n## Backends\n\nThe DSN scheme selects the backend — nothing else in your code changes:\n\n| Scheme(s) | Backend | Extra |\n|---|---|---|\n| `auradb://`, `auradbs://` | **AuraDB server** (native AWP 1 over TCP/TLS) — auth + TLS | — |\n| `aura://`, `auras://`, `aura+tcp://` | AuraDB reference protocol path (bundled; not the network server) | — |\n| `aura+memory://`, `memory://` | In-memory reference engine | — |\n| `sqlite://`, `sqlite+aiosqlite://` | SQLite (first-class local) | `[sqlite]` |\n| `postgres://`, `postgresql://`, `postgresql+asyncpg://` | PostgreSQL | `[postgres]` |\n| `mysql://`, `mariadb://`, `…+aiomysql://` | MySQL / MariaDB | `[mysql]` |\n| `mongodb://`, `mongodb+motor://` | MongoDB (document-native) | `[mongodb]` |\n| `redis://`, `redis+asyncio://` | Redis (limited key-value / cache) | `[redis]` |\n\n| Capability | AuraDB | Memory | SQLite | PostgreSQL | MySQL | MongoDB | Redis |\n|---|---|---|---|---|---|---|---|\n| CRUD + filters | yes | yes | yes | yes | yes | yes | by key |\n| Transactions | yes | yes | yes | yes | yes | no¹ | no |\n| Relationships | yes | yes | yes | yes | yes | yes | no |\n| JSON / document fields | yes | yes | yes² | yes² | yes² | yes | yes |\n| Full-text search | yes | yes | no | yes | yes | no | no |\n| Vector / hybrid search | yes | yes | no | no | no | no³ | no |\n| Graph traversal | yes | yes | no | no | no | no | no |\n\n¹ MongoDB transactions require a replica set. ² SQL backends store JSON/vector fields as JSON\ntext (the documented fallback). ³ MongoDB vector search requires a configured vector index.\nUnsupported features raise `AuraCapabilityError` (alias `AuraBackendCapabilityError`) — never\nsilently emulated. Per-backend guides:\n[AuraDB](docs/AURADB.md) · [SQLite](docs/SQLITE.md) · [PostgreSQL](docs/POSTGRESQL.md) ·\n[MySQL](docs/MYSQL.md) · [MongoDB](docs/MONGODB.md) · [Redis](docs/REDIS.md). See\n[docs/BACKENDS.md](docs/BACKENDS.md) and the\n[capability matrix](docs/BACKEND_CAPABILITY_MATRIX.md).\n\n## Error handling\n\nErrors carry stable codes and non-sensitive context and never embed credentials. Two are\ncentral to AuraDB use:\n\n- **`AuraCapabilityError`** — a requested feature (e.g. BM25 or hybrid search) is not\n  supported by the connected backend. The message names the backend and the missing\n  capability so callers can branch on it.\n- **`AuraNotLeaderError`** — in AuraDB's multi-node preview, a write reached a follower. It\n  carries the leader-routing hints (`leader_addr`, `leader_node_id`, `current_node_id`,\n  `retryable`, …). A `retryable=True` does **not** mean the connector retries automatically.\n\nSee the full taxonomy in [docs/ERRORS.md](docs/ERRORS.md).\n\n## Transactions\n\nThe native backend supports `begin` / `commit` / `rollback` with read-your-writes; reads\ninside a transaction observe its own staged writes and not its staged deletes, invisible to\nother connections until commit. The model is **snapshot isolation**: read-your-writes over\ncommitted state with optimistic (first-committer-wins) conflict detection on commit. It is\nnot serializable isolation, and the connector does not upgrade it. `transaction(isolation=…)`\ndefaults to `\"snapshot\"`; `\"serializable\"` is accepted only as a deprecated compatibility\nalias for snapshot isolation.\n\nIn the cluster preview, transaction ids are node-local and a redirect mid-transaction is\n**not** performed automatically: if a leader changes, restart the transaction against the new\nleader. AuraDB's multi-node mode has no production high availability or automatic failover —\nsingle-node is the recommended production deployment. See\n[docs/TRANSACTIONS.md](docs/TRANSACTIONS.md) and the\n[`auradb_not_leader`](examples/auradb_not_leader.py) /\n[`auradb_leader_redirect`](examples/auradb_leader_redirect.py) examples.\n\n## AuraDB boundary\n\nThis package is the client and connector. AuraDB server features (storage, server-side\ncost-based planning, distributed transaction coordination on a live cluster) live in the\nseparate [AuraDB](https://github.com/Ohswedd/auradb) project. Operations that require a live\nserver fail with a structured error rather than pretending to succeed. See\n[AuraDB boundary](docs/AURADB_BOUNDARY.md).\n\n## Documentation\n\n- [Getting Started](docs/GETTING_STARTED.md) · [Architecture](docs/ARCHITECTURE.md) ·\n  [AuraDB boundary](docs/AURADB_BOUNDARY.md)\n- [Models](docs/MODELS.md) · [Query Builder](docs/QUERY_BUILDER.md) ·\n  [Client](docs/CLIENT.md) · [Vectors](docs/VECTORS.md)\n- [Search \u0026 Ranking](docs/SEARCH_AND_RANKING.md) · [Transactions](docs/TRANSACTIONS.md) ·\n  [Errors](docs/ERRORS.md) · [Migrations](docs/MIGRATIONS.md)\n- [AuraDB backend](docs/AURADB.md) · [Backends](docs/BACKENDS.md) ·\n  [Capability matrix](docs/BACKEND_CAPABILITY_MATRIX.md)\n- [Protocol](docs/PROTOCOL.md) · [Transports](docs/TRANSPORTS.md) ·\n  [SQL compiler](docs/SQL_COMPILER.md) · [Native acceleration](docs/NATIVE_ACCELERATION.md)\n- [Observability](docs/OBSERVABILITY.md) · [CLI](docs/CLI.md) ·\n  [Compatibility](docs/COMPATIBILITY.md) · [Testing](docs/TESTING.md) ·\n  [Roadmap](docs/ROADMAP.md)\n\n## Testing\n\n```bash\npython -m pytest -vv\n```\n\nThe suite is deterministic and requires no external services. It covers models, fields,\nvectors, schema generation, the query builder, protocol frames and golden bytes, transports,\nclient lifecycle, hydration, errors, migrations, observability, typing, and example smoke\ntests. See [Testing](docs/TESTING.md).\n\n## Security\n\nThe client validates and length-bounds every protocol frame, fails closed on protocol errors,\nnever embeds secrets in errors or logs, and redacts credentials in configuration `repr`. To\nreport a vulnerability, see [SECURITY.md](SECURITY.md).\n\n## Contributing\n\nContributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for setup, the dev and\nnative build, test commands, and code style, and the [Code of Conduct](CODE_OF_CONDUCT.md).\n\n## License\n\nApache-2.0. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fohswedd%2Faura-connector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fohswedd%2Faura-connector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fohswedd%2Faura-connector/lists"}