Crypta is a privacy‑first, decentralized datastore and app platform — a modern fork of Hyphanet/Freenet.
Crypta is a platform for censorship‑resistant communication and publishing. It is a fork of Hyphanet (formerly Freenet) that builds on its core ideas while modernizing usability, performance, and developer experience. Crypta provides a peer‑to‑peer, distributed, encrypted, and decentralized datastore on top of which applications such as forums, chat, micro‑blogs, and websites can run without central servers.
Why fork? Hyphanet/Freenet pioneered privacy‑preserving routing and content‑addressed storage, but several long‑standing frictions hold it back:
- Usability and onboarding: confusing opennet/darknet concepts, painful first‑run setup, and limited, dated UIs make it hard for new users to join and stay.
- Performance for cold content: the anonymity model and multi‑hop routing can lead to slower retrievals, especially for infrequently accessed data; bootstrap and NAT traversal further compound early‑session latency.
- Observability without compromising privacy: network‑wide performance and health are hard to measure, making tuning and evolution slow and error‑prone.
Crypta’s vision is to keep the privacy and resilience, while making it pleasant, fast, and sustainable to use and build on:
- User experience first: a modern web UI, sensible defaults, and a one‑click guided onboarding that hides complexity (smart opennet bootstrap, optional darknet linking later).
- Faster routing and retrieval: adaptive, locality‑aware routing; popularity‑sensitive caching; opportunistic prefetch; and transport updates (e.g., QUIC/HTTP‑3, improved congestion control, and better NAT traversal) for lower tail latency.
- Safe observability: privacy‑preserving telemetry and reproducible benchmarking harnesses to inform tuning without leaking user data.
- A better platform: typed configuration and testable interfaces to make extending the network straightforward.
This repository contains the reference node (the “Crypta reference daemon”) that participates in the network, stores data, and serves applications.
- Overview
- Quick Start
- Building
- Testing
- Code Quality
- Running Your Build
- Development Guidelines
- Dependencies
- Spotless + Dependency Verification
- Versioning
- Branching & Releases
- Update System
- Architecture Overview
- License
Choose one of the following options.
-
Windows
- This repository does not build Windows installers. Use the portable distribution or the jpackage app image below. If a Windows installer is published on the project’s Releases page, you can install it by double‑clicking; if SmartScreen warns, click “More info” → “Run anyway”.
-
macOS (.dmg)
- Download the DMG from the Releases page and open it.
- Drag “Crypta.app” to Applications. If Gatekeeper blocks it, right‑click → Open (or allow in Settings → Privacy & Security).
- Launch “Crypta” from Applications/Launchpad.
-
Debian/Ubuntu (.deb)
- Install from a local .deb:
sudo apt install ./Crypta-<version>_amd64.deb # adjust arch/version
- Install from a local .deb:
-
Fedora/RHEL/openSUSE (.rpm)
- Install from a local .rpm:
sudo dnf install ./Crypta-<version>.x86_64.rpm # or: sudo zypper install ./...
- Install from a local .rpm:
-
Snap (.snap)
- Local snap install (not from store):
sudo snap install --dangerous ./crypta-<version>.snap
- Local snap install (not from store):
-
Flatpak (.flatpak or .flatpakref)
- Local Flatpak bundle:
flatpak install --user ./crypta-<version>-amd64.flatpak flatpak run network.crypta.cryptad//v1
- Local Flatpak bundle:
Linux servers (no desktop environment)
- On systems without a desktop environment, the installer (deb/rpm) creates a systemd unit
cryptad.serviceand enables it, but does not start it automatically. You must start it manually after install:sudo systemctl start cryptad
After installation, start Crypta from your OS application launcher (on desktops). The app starts the daemon, opens the UI in your browser on the first successful start, and manages start/stop for you.
Build the portable distribution and run the Swing launcher without installing system packages:
./gradlew assembleCryptadDist
build/cryptad-dist/bin/cryptad-launcher # Windows: cryptad-launcher.batThe launcher starts the daemon, streams live logs, detects the FProxy port from lines like
Starting FProxy on ...:<port>, and opens http://localhost:<port>/ on the first successful start.
Shortcuts (global):
- ↑/↓ one row; PgUp/PgDn one page.
- ←/→ move focus among the three buttons (wrap‑around).
- Enter/Space click focused button; s start/stop; q quit.
Notes
- Live output combines the wrapper’s console with tailing of the wrapper log file when configured, so JVM logs appear while the wrapper is running.
- On Unix/macOS the launcher uses a pseudo‑tty (via
script) when available to reduce buffering.
We use the Gradle Wrapper. If you trust the committed wrapper, you can build immediately.
Prerequisites:
- Java 25 or newer
- A POSIX shell or Windows terminal
Build the node JAR (prints SHA‑256 of the output):
./gradlew buildJarClean build:
./gradlew clean buildJarCryptad now uses a partial multi-project Gradle build.
- The root project remains the daemon/application project. It still owns the daemon JAR, tests,
run,runLauncher,assembleCryptadDist, and jpackage task graph. :foundation-supportowns the current stable generic support subset undernetwork.crypta.support,network.crypta.support.api,network.crypta.support.io,network.crypta.support.compress,network.crypta.support.math,network.crypta.support.transport.ip, plusnetwork.crypta.io.AddressIdentifier,network.crypta.io.WritableToDataOutputStream,network.crypta.node.FSParseException,network.crypta.node.FastRunnable, andnetwork.crypta.node.SemiOrderedShutdownHook.:foundation-store-contractsowns the neutralnetwork.crypta.storecontractsBlockMetadata,GetPubkey, andStorableBlock, plus the store-maintenance alert seam undernetwork.crypta.store.alerts.:foundation-crypto-keysownsnetwork.crypta.crypt,network.crypta.keys, and the crypto-adjacentnetwork.crypta.support.io.BucketToolsandnetwork.crypta.support.io.PrependLengthOutputStreamhelpers.:foundation-storeowns the reusablenetwork.crypta.storeimplementations plusnetwork.crypta.store.cachingandnetwork.crypta.store.saltedhash.:interop-wireowns the narrow wire/message/schema/version/probe nucleus: leaf-safenetwork.crypta.io.commmessage/schema classes,network.crypta.node.Version,network.crypta.node.probe.ErrorandType, andnetwork.crypta.support.Serializer.:foundation-configownsnetwork.crypta.config,network.crypta.l10n, and the mainnetwork/crypta/l10n/crypta.l10n.en.propertiesresource. Its public APIs now export:foundation-supportand:foundation-fswhere config types exposeSimpleFieldSetor filesystem-facing value types.:foundation-fsownsnetwork.crypta.fs.:foundation-compatownsnetwork.crypta.compat.:runtime-spiownsnetwork.crypta.runtime.spiand the JDK-only runtime/config boundary used by higher layers, including detached FCP peer management plus the admin-HTTP config, connectivity, connections, queue, security-levels, shared page-chrome, core-update action, first-time-wizard, symlinker, and welcome-page slices.:thirdparty-onionownscom.onionnetworksandlib/fec.properties.:thirdparty-legacyownsorg.bitpedia,org.sevenzip, andorg.spaceroots.:launcher-desktopownsnetwork.crypta.launcher,com.jthemedetecor,oshi, and launcher resources.- The large cyclic daemon core remains in the root project for now, and all tests still live
there. The root still owns daemon-coupled transport/socket code in
network.crypta.io.comm, runtime adapters and helpers undernetwork.crypta.node.runtime, and the remaining daemon-coupled support/UI wiring. - Higher-level infrastructure now crosses a narrower boundary through
network.crypta.runtime.spi.RuntimePorts, the minimal wire-sideMessageSourceseam used by leaf-owned messages, and package-local seams such asnetwork.crypta.node.runtime.LegacyRuntimePorts,network.crypta.clients.http.BookmarkEditorToadletRuntimePorts,network.crypta.clients.http.ConfigToadletRuntimePorts,network.crypta.clients.http.ConnectionsToadletRuntimePorts,network.crypta.clients.http.FileInsertWizardToadletRuntimePorts,network.crypta.clients.http.FirstTimeWizardToadletRuntimePorts,network.crypta.clients.http.QueueToadletRuntimePorts, andnetwork.crypta.clients.http.SecurityLevelsToadletRuntimePorts,network.crypta.clients.http.WelcomeToadletRuntimePorts,network.crypta.clients.http.FProxyRuntimeSupport,network.crypta.clients.http.HttpShellRuntimeSupport, andnetwork.crypta.clients.http.bookmark.BookmarkRuntimeSupport.
The wrapper validates the distribution URL (validateDistributionUrl=true in
gradle/wrapper/gradle-wrapper.properties). To also verify the download by checksum, add
distributionSha256Sum=<sha256> for the chosen Gradle distribution.
- Run all tests:
./gradlew test- Run a specific test class:
./gradlew test --tests *TestClassName- Run a specific test method:
./gradlew test --tests *TestClassName.methodName- Compile only:
./gradlew compileJava- Formatting via Spotless is configured; see the Spotless + Dependency Verification section if verification blocks resolution.
- Gradle daemon is enabled by default; avoid passing
--no-daemon.
To try your local build of Crypta:
- Build it with
./gradlew buildJar. - Stop your running node.
- Replace the existing node JAR with
build/libs/cryptad.jarproduced by the build. - Start your node again.
If you want to test the launcher without the real daemon, build with a dummy script that simulates output (including the FProxy line):
./gradlew -PuseDummyCryptad=true assembleCryptadDist
build/cryptad-dist/bin/cryptad-launcher
Distribution (Java Service Wrapper):
- Build a portable distribution (downloads the Tanuki wrapper and assembles bin/conf/lib):
./gradlew assembleCryptadDist
- Package it as a tar.gz:
./gradlew distTarCryptad
The resulting tree at build/cryptad-dist contains:
bin/cryptadand wrapper binariesbin/cryptad-launcher(andcryptad-launcher.baton Windows)conf/wrapper.confconfigured to uselib/*.jarlib/cryptad.jar, runtime dependencies, andlib/wrapper.jar
The launcher defers config path resolution to the runtime via AppEnv (no hard‑coded
cryptad.ini), adapting to system services or per‑user environments.
Use the repo’s Gradle defaults for daemon, parallelism, and JVM settings. Avoid --no-daemon,
--parallel, and ad-hoc CLI JVM tuning when running local builds.
Build a minimal JRE image that embeds the Cryptad distribution using direct jlink/jdeps tasks (no external runtime plugin):
# 1) Build the wrapper-based dist the jlink step consumes
./gradlew assembleCryptadDist
# 2) Create the jlink image and zip/tar.gz archives
./gradlew distJlinkCryptad
# Result:
# - build/cryptad-jlink-image/ (runnable image)
# - build/distributions/cryptad-jlink-v<version>.zip
# - build/distributions/cryptad-jlink-v<version>.tar.gz
# Launch using the embedded runtime (no system JRE required):
build/cryptad-jlink-image/bin/cryptad-launcher # Windows: cryptad-launcher.batNotes
- The jlink image includes
bin/cryptad-launcherwhich prefers the embeddedbin/javaand useslib/*for classpath. - We explicitly include key modules (e.g.,
jdk.crypto.ec,java.net.http,jdk.unsupported,java.desktop) and calljlinkdirectly. - This does not alter the existing wrapper-based distribution; it is an additional, self-contained runtime option.
bin/cryptad-launcherandcryptad-launcher.batnow auto-detect the embedded runtime: when run from the jlink image they preferimage/bin/java; outside the image they fall back to$JAVA_HOME/bin/javaorjavaonPATH.
Build a desktop app image and (on macOS/Linux) native installers with jpackage. The image embeds a minimal runtime and
bundles the portable distribution under app/cryptad-dist/ so the GUI can invoke the wrapper reliably.
Commands
# Build includes the jpackage app image.
# On Linux and macOS, it also builds native installers when tooling is present
# (Linux: DEB/RPM via `dpkg-deb`/`rpmbuild`; macOS: DMG). On Windows, installers
# are not built by `build`.
./gradlew build
# App image only
./gradlew jpackageImageCryptad
# Native installer (macOS: .dmg; Linux: .deb or .rpm)
# - Auto-picks type on Linux (prefers rpm when available)
./gradlew jpackageInstallerCryptad
# Force a specific Linux package type
./gradlew jpackageInstallerRpm # requires rpmbuild
./gradlew jpackageInstallerDeb # requires dpkg-deb
# Or override the auto-detected Linux type
./gradlew -PlinuxInstaller=rpm jpackageInstallerCryptadOutputs (macOS example)
- App image:
build/jpackage/Crypta.app - Installer:
build/jpackage/Crypta-<numeric>.dmg
Details
- App metadata: Name
Crypta, Vendorcrypta.network, App IDnetwork.crypta.cryptad. - Main entry:
network.crypta.launcher.Launcher. - Icons:
src/jpackage/macos/cryptad.icns,src/jpackage/windows/cryptad.ico,src/jpackage/linux/cryptad.png. - Included docs:
LICENSE.txt,EULA.txt(fromLICENSE),README.txt(fromREADME.md). - App layout: the launcher config (
Crypta.cfg) sets classpath toapp/cryptad-dist/lib/*.jar; jars are not duplicated inapp/. - Versioning note: jpackage enforces numeric
--app-version(e.g.,1). Installer filenames follow jpackage defaults (e.g.,Crypta-<version>.<ext>). Note: Windows installers are not built; Windows builds produce only the app image.
Linux notes
- RPM builds require
rpmbuildto be installed and on PATH. - When both
dpkg-debandrpmbuildare installed, the default task prefers RPM. You can force DEB/RPM using the tasks above or-PlinuxInstaller=<deb|rpm>. - The
buildtask on Linux now depends on building all available Linux installers (DEB/RPM) and will skip any installer type whose tool is missing.
macOS notes
- The
buildtask on macOS now also builds a.dmgviajpackage. - Unsigned DMGs are fine for local testing; macOS may require right‑click → Open or removing quarantine to run the app the first time.
Linux behavior and service
- Install location: the app image installs under
/opt/cryptad/Cryptaand the launcher/scripts expect/opt/cryptad. - Server vs desktop detection:
- Considered a “desktop” only when a display manager (
display-manager.service) exists and is enabled or active. - As a fallback, presence of session files (
/usr/share/xsessions/*.desktopor/usr/share/wayland-sessions/*.desktop) also counts as desktop. - This avoids mislabeling headless servers that happen to default to
graphical.target.
- Considered a “desktop” only when a display manager (
- Install‑time actions:
- Server (no desktop): install a systemd unit at
/etc/systemd/system/cryptad.service, thensystemctl daemon-reloadandenableit. The service is NOT auto‑started; start it manually when ready. - Desktop: install a
.desktopentry at/usr/share/applications/crypta.desktopand refresh caches when tools are present (update-desktop-database,gtk-update-icon-cache).
- Server (no desktop): install a systemd unit at
- Accounts and data:
- Creates an explicit system group
cryptad, then a system usercryptadwith primary groupcryptad(home/var/lib/cryptad, shellnologin). - Ensures
/var/lib/cryptadexists and is owned bycryptad:cryptad(0750). Application state/log/cache directories defined in the systemd unit (e.g.,StateDirectory=cryptad) are managed by systemd on first start.
- Creates an explicit system group
- Removal and cleanup:
- DEB
postrm/RPM%preundisable and stop the unit only when it is enabled or active (race‑free check), remove the unit file, and rundaemon-reload. - Desktop caches are refreshed;
.desktopis removed when present. Scripts tolerate missing desktop tooling. - The
cryptaduser/group and data directory are preserved to avoid data loss. Remove them manually if desired.
- DEB
Manual service control (Linux)
Service management (Linux):
sudo systemctl status cryptad
sudo systemctl start cryptad # start explicitly after installation
sudo systemctl stop cryptad
sudo systemctl disable --now cryptadPackage removal behavior (Linux)
- DEB removal: disables/stops the service if enabled/active, removes
/etc/systemd/system/cryptad.service, reloads systemd, and removes the desktop entry if present. Thecryptaduser/group and/var/lib/cryptadremain. - RPM removal:
%preunperforms the same service cleanup; the user/group and data remain.
To remove the account and data explicitly (optional):
sudo systemctl disable --now cryptad || true
sudo rm -f /etc/systemd/system/cryptad.service && sudo systemctl daemon-reload
sudo rm -rf /var/lib/cryptad
sudo userdel cryptad 2>/dev/null || true
sudo groupdel cryptad 2>/dev/null || trueTroubleshooting (macOS)
- Unsigned app first‑run: right‑click → Open, or clear quarantine:
xattr -dr com.apple.quarantine "build/jpackage/Crypta.app"- See launcher logs by running the Mach‑O launcher in Terminal:
build/jpackage/Crypta.app/Contents/MacOS/Crypta 2>&1 | tee /tmp/crypta-run.log- Run the embedded JRE directly to isolate classpath issues:
cd build/jpackage/Crypta.app/Contents
./runtime/bin/java -cp "app/cryptad-dist/lib/*" network.crypta.launcher.Launcher- The Windows batch launcher (
bin/cryptad.bat) passes a per‑user anchor location to the wrapper:"wrapper.anchorfile=%LOCALAPPDATA%\Cryptad.anchor". - The Swing launcher requests a graceful stop by deleting that file; the Java Service Wrapper notices and shuts down the JVM cleanly (running shutdown hooks, flushing logs, etc.).
- If the process tree is still alive after ~25 seconds, the launcher escalates to
taskkill(first without/F, then with/F). - Advanced: To change the anchor path, customize the batch file or pass a different property on the command line; a value in
wrapper.confis overridden by the batch property.
- Env override: set
CRYPTAD_PATHto an absolute path or a path relative to your current working directory to force a specific wrapper script, e.g.export CRYPTAD_PATH=bin/cryptad. - Default resolution order (first match wins):
- From the running
cryptad.jardirectory:<jarDir>/cryptad. - From the assembled distribution layout:
<jarDir>/../bin/cryptad. - Fallbacks from
user.dir:./bin/cryptad, then./cryptad.
- From the running
- Primary language: Java
- Code style:
- Tests: JUnit; target 80%+ coverage
- Documentation: Add or update Javadoc when editing Java files
- Runtime: Java 25+
- Tooling: Gradle Wrapper (provided in this repo)
- External libraries are managed via Gradle.
- Dependency verification is enabled. When adding or updating libraries:
- Declare versions in
gradle/libs.versions.tomland add usages inbuild.gradle.kts. - Update verification metadata so
gradle/verification-metadata.xmland keyrings reflect the new artifacts; use the commands in “Spotless + Dependency Verification” below.
- Declare versions in
Root build also includes:
:foundation-support: extracted stable support/api/io/compress/math/transport subset plusnetwork.crypta.io.AddressIdentifier,network.crypta.io.WritableToDataOutputStream,network.crypta.node.FSParseException,network.crypta.node.FastRunnable, andnetwork.crypta.node.SemiOrderedShutdownHook.:foundation-store-contracts: neutral store contracts plus the store-maintenance alert seam shared by store code and root runtime/UI adapters.:foundation-crypto-keys: extractednetwork.crypta.crypt,network.crypta.keys, and the adjacentBucketTools/PrependLengthOutputStreamhelpers.:foundation-store: extracted reusablenetwork.crypta.storeimplementations, caching, and salted-hash storage code.:interop-wire: extracted wire/message/schema/address/version/probe nucleus plusnetwork.crypta.support.Serializer.:foundation-config: extracted config/l10n code and main l10n resources. Its public APIs re-export:foundation-supportand:foundation-fswhere required.:launcher-desktop: Swing launcher code and desktop/theme detection dependencies.:thirdparty-onion: Onion FEC and related vendored sources/resources.:thirdparty-legacy: Bitpedia, SevenZip, and Spaceroots vendored code.:runtime-spi: JDK-only runtime ports plus immutable config snapshot/value types used by FCP and other infrastructure code.:foundation-fsand:foundation-compat: extracted filesystem/environment and compatibility leaf modules used by the root daemon.
When Gradle dependency verification is strict, Spotless may fail to resolve formatter artifacts (e.g., google-java-format). If that happens:
- Temporarily set verification to lenient in
gradle.properties:org.gradle.dependency.verification=lenient
- Write verification metadata (SHA256 + PGP):
./gradlew --write-verification-metadata sha256,pgp spotlessApply- Optional exact version refresh:
./gradlew --refresh-dependencies --write-verification-metadata sha256,pgp spotlessApply
- Faster alternative (no formatting run):
./gradlew --write-verification-metadata sha256,pgp spotlessInternalRegisterDependencies
- Confirm entries in
gradle/verification-metadata.xmlforcom.google.googlejavaformatand trusted keys. - Restore strict mode:
org.gradle.dependency.verification=strict
- Validate:
./gradlew spotlessApply
Tip: Keep the Spotless formatter at the intended version (currently googleJavaFormat("1.28.0")). If verification still blocks, re‑write metadata including pgp and ensure a group‑level trusted key entry. Commit updated verification keyring files as appropriate.
- The build number is a single integer in
build.gradle.kts(e.g.,version = "<int>"). - During build, tokens are replaced into the generated version source file (e.g.,
@build_number@,@git_rev@). - Version strings support both Cryptad and Fred formats for wire compatibility; protocol compatibility enforces minimum builds.
- Standard branching and release workflow: see
docs/standard-git-branching-and-release-workflow.md(validated copy). The original wiki page is also available: https://github.com/crypta-network/cryptad/wiki/Standard-Git-Branching-and-Release-Workflow-for-Cryptad - Release workflow and operations runbook
- Core updates use a package‑based updater (“CoreUpdater”). It subscribes to an
info/<N>JSON descriptor via the existing update USK, selects an OS/arch‑specific installer (deb/rpm/dmg/exe/flatpak/snap), and downloads tonodeDir/updates/core/<version>/. - Installing the OS package is a user/OS action. On Linux, the UI may hand off to the system’s software center or PackageKit. On macOS/Windows, follow the platform guidance shown in the UI.
- JAR Update‑over‑Mandatory (UOM) for the core is disabled in favor of the package flow.
- For developer testing, replacing
build/libs/cryptad.jarmanually (as noted above) is fine; for production use CoreUpdater and platform packages.
- Build/module layout:
- Root project
:cryptadremains the daemon/application build and still owns the strongly coupled core packages, all tests, packaging/runtime tasks, and the currentLegacyRuntimePortsbridge into the runtime SPI. - Leaf subprojects are
:foundation-support,:foundation-store,:foundation-store-contracts,:foundation-crypto-keys,:interop-wire,:foundation-config,:foundation-fs,:foundation-compat,:runtime-spi,:thirdparty-onion,:thirdparty-legacy, and:launcher-desktop.
- Root project
- Core network (
network.crypta.node):Node,PeerNode,PeerManager,PacketSender,RequestStarter,RequestScheduler,NodeUpdateManager. - Storage (
network.crypta.store):FreenetStore,CHKStore,SSKStore,SlashdotStore.:foundation-storenow owns the reusable store implementations, cache layer, and salted-hash storage code.:foundation-store-contractsowns the neutral contracts plus thenetwork.crypta.store.alertsseam used by root runtime/UI adapters such asUserAlertManagerStoreAlertSink. - Crypto (
network.crypta.crypt): AES, DSA/ECDSA, SHA‑256,RandomSource/Yarrow. This package now lives in:foundation-crypto-keys. - Keys (
network.crypta.keys):ClientCHK,ClientSSK,FreenetURI, USK. This package now lives in:foundation-crypto-keys. - Wire/message nucleus (
network.crypta.io.comm,network.crypta.node.Version,network.crypta.node.probe,network.crypta.support.Serializer)::interop-wireowns the leaf-safe message/schema/address/version/probe subset, includingMessage,MessageType,Peer,FreenetInetAddress,Version, and the probe enums. The root project still owns the transport/socket/filter side ofnetwork.crypta.io.comm, andMessagenow depends on the minimalMessageSourceseam rather than directly onPeerContext. - Clients:
network.crypta.client, FCP (network.crypta.clients.fcp), HTTP (network.crypta.clients.http). FCP now consumes execution, randomness, transfer policy, lifecycle, config access, and detached peer mutations throughRuntimePortsand FCP-local adapters instead of reaching directly into daemon internals for those concerns. FCP bootstrap now flows throughFcpServerDependenciesandCoreFcpServerDependenciesFactory, with package-local seams such asFcpServerRuntimeSupport,FcpMessageRuntimeSupport,FcpFetchRuntimeSupport, andFcpInsertRuntimeSupportsplitting server-owned, message-owned, GET/fetch, and insert/USK concerns. The migrated HTTP management and shell slices now cross the boundary in two layers:RuntimePortsfor JDK-only detached runtime state and package-local helpers such asBookmarkRuntimeSupport,FProxyRuntimeSupport,HttpShellRuntimeSupport,HttpShellFProxyBootstrap, andFProxyRegistrarDependencies. Those paths now cover config export and persistence, connectivity and friends/strangers snapshots, selected-peer actions, queue page/download/insert/mutation/support and completion flows, security-level state and warnings, shared page chrome, core-update actions, first-time-wizard snapshots plus current bandwidth limits, symlinker persistence, welcome-page reads/actions, bookmark runtime wiring, and N2NTM compose/send flows. - Runtime SPI (
network.crypta.runtime.spi): JDK-only ports and detached DTOs such asRuntimePorts,ConfigPort,NodeInfoPort,PeerPort,ConnectionsPagePort,ConnectionsSupportPort,DarknetConnectionsPort,DarknetMessagingPort,QueuePagePort,QueueDownloadPort,QueueInsertPort,QueueMutationPort,QueueSupportPort,QueueCompletionPort,SecurityLevelsPort,PageChromePort,CoreUpdateActionPort,FirstTimeWizardPort,ToadletSymlinkPort,WelcomePagePort,WelcomeActionPort,ConfigSnapshot,ConfigFieldSet,QueuePageSnapshot,QueueInsertOutcome,SecurityLevelsSnapshot,PageChromeSnapshot,FirstTimeWizardSnapshot,FirstTimeWizardCurrentBandwidthLimits,ToadletSymlinkEntry, andWelcomePageSnapshot. - Config + localization leaf (
:foundation-config):network.crypta.config,network.crypta.l10n, and the main l10n properties. Its public APIs re-export:foundation-supportand:foundation-fswhere config surfaces exposeSimpleFieldSetor filesystem-facing types. Higher layers should still preferRuntimePorts#config()and the rootLegacyConfigPortbridge instead of reaching through daemon internals. - Support foundation leaf (
:foundation-support): stable generic support, support-api, support-io, support-compress, support-math, and transport-IP classes plusnetwork.crypta.io.AddressIdentifier,network.crypta.io.WritableToDataOutputStream,network.crypta.node.FSParseException,network.crypta.node.FastRunnable, andnetwork.crypta.node.SemiOrderedShutdownHook. - Support (
network.crypta.support): logging, data structures, threading, and helpers are now split between:foundation-supportand the root project. Keep generic reusable utilities in the foundation leaf; daemon-coupled support code still remains in root. - Launcher/Desktop:
:launcher-desktopprovidesnetwork.crypta.launcher,com.jthemedetecor, launcher resources, and desktop-theme integration. - Extracted foundations:
:foundation-supportprovides the stable generic support subset,:foundation-store-contractsprovides neutral store contracts and alert seams,:foundation-crypto-keysprovidesnetwork.crypta.cryptandnetwork.crypta.keys,:foundation-storeprovides reusable store implementations,:interop-wireprovides the wire/version/probe nucleus,:foundation-configprovides config/l10n,:foundation-fsprovidesnetwork.crypta.fs, and:foundation-compatprovidesnetwork.crypta.compat. - Runtime boundary leaf:
:runtime-spiprovidesnetwork.crypta.runtime.spi. - Vendored libraries:
:thirdparty-onionprovidescom.onionnetworks,:thirdparty-legacyprovidesorg.bitpedia,org.sevenzip, andorg.spaceroots.
You generally do not need to install libraries manually; Gradle resolves them.
Crypta is free software licensed under the GNU General Public License, version 3 only. See LICENSE for the full text.
Some bundled components may be under permissive licenses (e.g., Apache‑2.0, BSD‑3‑Clause). These are compatible with GPLv3 and included under their respective terms.
