Kotoba

Where to start

What Kotoba isWho she is and where she runs, in one page
InstallingOne package, two commands
First runA key, a model, her first words
The approval gateHow she asks before she acts
The two voice modesLocal voice, or the agent tunnel
The soul fileChange who she is
RoadmapWhat grows next, and what was cut on purpose

Or a section

↑↓ move openesc close124 pages
All pages

Contributing and reference8 of 12

Licence

About 5 minutes to read

On this page

Kotoba is MIT. The full text is in LICENSE, and the copyright line reads Copyright (c) 2026 Kotoba contributors.

What MIT lets you do

Use it, copy it, change it, merge it into something else, publish it, sublicense it, and sell it. There is no revenue threshold, no non-commercial clause and no "open core" tier. Kotoba has exactly one edition, and this is it.

The one condition: the copyright notice and the permission notice must travel with the software, in copies and in substantial portions of it. Ship the LICENSE file.

And the usual: no warranty, no liability. It is provided as is.

Using it commercially

Nothing in the MIT licence stops you. Build a product on it, run it for clients, keep your changes private, charge for the result.

Three things that are not MIT questions but come up in the same breath:

  • The model provider is a separate contract. Your calls go to OpenAI or xAI (or an OpenAI-compatible endpoint you choose) under their terms, not this licence.
  • ElevenLabs is a separate contract for speech, on the same footing.
  • Live2D has its own terms, and one of them is a revenue threshold. See below — it is the one that catches people.

Third parties

THIRD_PARTY_NOTICES.md is the authoritative record. This page summarises it; where the two disagree, that file is right.

The file exists because the Python package carries the frontend already compiled. Third-party JavaScript therefore travels inside the wheel even though its sources do not, and minification strips almost every banner comment those packages ship. A notice that only survives by accident is not a notice, so the licence texts in that file are reproduced by hand.

Nothing on the Python side is vendored: every Python dependency is installed from its own published package with its own licence intact, so no notice is owed there.

The inventory

The frontend's runtime dependency tree is 239 packages, and every one is listed, because any of them may be compiled into the bundle in whole or in part. Over-inclusion is the safe direction, so nothing is pruned by hand — build tooling appears in the list even though the wheel ships compiled output with no node_modules beside it.

LicencePackages
MIT216
ISC12
Apache-2.05
BSD-3-Clause3
Apache-2.0 and BSD-3-Clause1
0BSD1
CC-BY-4.01

That block is generated by scripts/licenses.py from the real dependency tree, and api/tests/test_the_notices_are_not_kept_by_hand.py re-runs the generator and fails if the file has drifted. A list that long, kept by hand, is a list that is quietly wrong. Two further tests check that no copyright line was invented — a package's own statement is reproduced, or nothing is — and that no package in the runtime tree is missing from the file. Measured: those checks pass.

Notable individual obligations, all recorded in full in the notices file:

  • Apache-2.0livekit-client, @livekit/protocol, @livekit/mutex, @swc/helpers, baseline-browser-mapping. The LiveKit packages arrive through the ElevenLabs browser SDK, which uses LiveKit for the WebRTC call. None ships a NOTICE file, so section 4(d) adds nothing.
  • BSD-3-Clausewebrtc-adapter, and the varint codec inside @bufbuild/protobuf.
  • The FXAA shader inside pixi.js carries its own BSD notice. pixi.js itself is MIT; that one shader is not.
  • ISCearcut, and eleven others.

Live2D — the part that trips people

Two different things, with two different answers.

No Live2D model ships. Not one. Models belong to their authors, and the good ones — Live2D's own free samples included — forbid redistribution. Committing one here would republish somebody else's work under this repository's licence. So:

  • public/models/ is gitignored and must stay that way.
  • Models live on the user's machine, in ~/.kotoba/models/.
  • The browser's first-run screen offers to fetch the free sample onto your machine, with its licence terms shown first. The repository never carries one.
  • scripts/build_web.py refuses to build if it finds a .moc3 or .model3.json anywhere under public/, following symlinks.

The Cubism runtime does ship, and it is allowed to. Two pieces:

  • Live2D Cubism Corepublic/live2dcubismcore.min.js, redistributed under the Live2D Proprietary Software Licence Agreement as "Redistributable Code". Its own header states the terms.
  • Live2D Cubism Web Framework — Copyright © Live2D Inc., used under the Live2D Open Software License Agreement. It arrives compiled inside pixi-live2d-display's cubism4 bundle rather than as a file of its own, and minification removes the source headers, which is why the notice is recorded by hand.

Two consequences for anyone redistributing Kotoba:

  1. The Framework may be distributed only as part of a work that also ships Live2D's own runtime, which is the Cubism Core above. Do not strip one and keep the other.
  2. Live2D asks any business whose annual gross revenue exceeds 10,000,000 JPY to hold a separate Cubism SDK Release License. That threshold is about the redistributor, not about this repository. If you are a company over it and you redistribute Kotoba, that licence is yours to obtain.

Using Kotoba yourself is not redistribution.

Where the licence lives in the package

api/pyproject.toml declares license = "MIT" and license-files = ["LICENSE", "THIRD_PARTY_NOTICES.md"] — the texts, not just the name, because MIT asks that the notice travel and the bundled JavaScript carries an Apache-2.0 obligation of its own.

Those two files sit at the repository root. A manifest cannot reach outside its own directory, so the build backend copies them into api/ on every wheel, sdist and editable build. The copies are not kept in the repository — they would drift — and api/tests/test_packaged_data.py holds them byte-identical when both exist. A build that can find neither the original nor a copy refuses, rather than producing an unlicensed wheel.

Credits

The agent patterns underneath — a personality file, persistent memory, modular tools — are adapted from Hermes Agent, which is MIT. None of its code is used; only its ideas, reworked for something voice-first with a face.