spicemine

Top-level Files of trunk
Login

Top-level Files of trunk

Files in the top-level directory from the latest check-in of branch trunk


spicemine

spicemine is a self-hosted home for version-controlled work: repositories in Fossil, git, Mercurial and Jujutsu, served over HTTPS and SSH, with spaces, invitations, scoped tokens, cross-engine mirrors, verified backups, and a browser UI in English and Japanese. One JVM, one directory, one thing to back up.

It is written in Common Lisp on the JVM, on a framework of its own called mélangej (ABCL on Jooby and Netty, no Lisp dependencies). The book that documents the framework is served by every instance at /melangej, and is in core/src/dist/book/.

The premise is in the first feature below: you can't look at everyone's code without signing in. It is your data, your code, your choice.

What it does

Dependencies

On the host, found on PATH or named with a -D property:

In the distribution, 29 jars, 39 MB, all from Maven Central:

what which why
ABCL 1.9.2 org.abcl:abcl, abcl-contrib the Common Lisp; contrib is on the classpath and loaded by nothing
Jooby 3.9.1 jooby, jooby-netty routing and the HTTP server; Netty 4.2 under it
JGit 7.3 org.eclipse.jgit the git engine's smart-HTTP, in-process
sqlite-jdbc 3.49, PostgreSQL 42.7, HikariCP 5.1 metadata: users, spaces, repositories, tokens, events
minimal-json 0.9.5 JSON where Java reads it
slf4j-simple 2.0 the logging the libraries above expect

No Lisp dependencies. No Quicklisp, no ASDF system, nothing vendored: twenty-five Lisp files loaded in order by boot.lisp. The Markdown renderer, HTML emitter, template compiler, JSON codec and migration machinery are in the tree, a few hundred lines each, and you can read all of it. MELANGEJ.md says which files are the framework and which are this service.

Building

core/gradlew -p core installDist        # -> core/build/install/spicemine/

That is the whole build: Gradle fetches the jars, compiles the seven Java files, copies the Lisp, and compiles it to fasls with warnings fatal (compile-all.lisp). The result is a directory with bin/spicemine-server, bin/spicemine-admin, bin/spicemine-ssh-keys, bin/spicemine-ssh-serve, lib/ and lisp/. A tarball of it is a release.

Run it from the checkout:

JAVA_HOME=/path/to/jdk17+ core/build/install/spicemine/bin/spicemine-server
# or, loading .lisp sources without the compile step:
core/gradlew -p core runCore -Pport=8643

First boot prints the instance admin's token once; spicemine-admin is how an operator with a shell gets back in. Everything is a -Dspice.* property or an environment variable; deploy/nixos/spicemine.nix lists them all with their meaning.

The gate that every change has to pass:

JAVA_HOME=/path/to/jdk17+ core/run-tests-all.sh

It builds, proves the build fails on an unreadable source, evaluates the NixOS module, runs the deploy script suites, the Lisp suites, and then starts a real instance and runs the setup instructions, the wire-mount authorisation, the scope form, self-hosting, and the SSH transport against it with the real clients. The browser suites run too when PLAYWRIGHT is set. core/run-tests-pg.sh repeats the suites on PostgreSQL.

Deployment

A release is a directory; the service is one JVM behind your TLS terminator; the state is one directory (spice.home), which is the one thing to back up.

No address, hostname or credential appears in this repository; every script takes them from the environment.

Documents

SPEC.md the system, section by section
AUTH.md sessions, tokens, scopes, SSH keys
MIRRORS.md mirrors, subs, what converts to what
DATABASE.md SQLite and PostgreSQL, migrations, the pool
WEBUI.md, SKINS.md, I18N.md, TEMPLATES.md the pages
GUARDIAN.md, TENANCY.md, MOBILE.md, POLICY.md, LICENSING.md, LINKS.md, TRACKERS.md, MERGE.md, ISSUES.md, JOURNAL.md, VERSIONING.md the rules and what is planned
MELANGEJ.md the framework's version and the split
SECURITY.md the monthly audit checklist, the pinned bill of materials, the findings; deploy/security-audit.sh runs the half a script can
deploy/README.md the runbook

Support

There is no commercial release and there will not be one: the platform is the platform, and everyone gets every feature. What may be paid for is services around it. Fork it, host it; that is what we do.

License

Copyright 2026 IoTone, Inc.

spicemine is licensed under the Apache License, Version 2.0: see LICENSE and NOTICE. You may use, change and redistribute it, in source or built, under that licence's terms; it comes with no warranty.

Each source file says so in two lines (Copyright 2026 IoTone, Inc., SPDX-License-Identifier: Apache-2.0), and the gate fails when one does not (core/src/test/sh/license-headers.sh). What spicemine ships that others wrote keeps its own licence: SBOM.md lists every component with it. The licence of a project hosted on an instance is its owner's choice and a different subject: LICENSING.md.

Inspirations