Features
Module Runtime
Load modules into Core - each module brings a custom element + Gin routes, namespaced into app API
Closed IPC Channels
Create security boundaries between scoped services - controlled inter-service communication
WebView2 Bindings
DI-exported interfaces in JS global scope - coroutine-speed native access, no Electron IPC tax
Service Container
Named registry with type-safe ServiceFor[T]() and MustServiceFor[T]() access
E2E Security Stack
Enchantrix for encryption, Borg for secure containers - full E2E when combined
Zero Wiring SDK
npm package (coming) lets PWAs tap native controls without manual binding
Installation
# Go 1.25+ workspace
go get github.com/Snider/Core
# Development tasks
task gui:dev # Wails dev mode with hot reload
task cli:build # Build CLI binary
task check # Lint + test + review
Usage
Module Architecture
Module = Custom HTML Element + Gin Routes
↓ Load into Core
Routes namespaced → /api/v1/module-name/*
Element renders → <module-name-dashboard></module-name-dashboard>
↓ Collective unit
Multiple modules = composable app functionality
Closed IPC Security Boundaries
// Create scoped channel between services
channel := core.NewClosedIPC("crypto-service", "storage-service")
// Only these services can communicate on this channel
channel.Send(core.Message{Type: "encrypt", Data: payload})
// External services cannot intercept or inject
Module Loading
core, err := core.New(
core.WithModule(mining.Module), // Adds /api/v1/mining/* routes
core.WithModule(wallet.Module), // Adds /api/v1/wallet/* routes
core.WithServiceLock(), // Lock after init
)
E2E Stack Integration
Enchantrix → Pre-obfuscation before CPU encryption (Ring-3 safe)
Borg → Secure containers for module packaging
Core → Closed IPC channels between services
LTHN → Consent-gated network transport
Result: E2E encrypted from storage to wire
Quick Links
More from Lethean R&D Labs
Fancy helping out?
Spotted a bug? Got an idea? We'd love to hear from you.
Read the contributing guide →