Move BackupProgress { complete: true } into the same db.mutate() as the
DesiredStatus revert in the backup transition. Previously these were
separate mutations—the status would revert to Running before progress
showed complete, causing a visible gap in the UI.
After setuid, the kernel clears the dumpable flag, making /proc/self/
entries owned by root. This broke open("/dev/stderr") for non-root
users inside subcontainers. The previous fix (chowning /proc/self/fd/*)
was dangerous because it chowned whatever file the FD pointed to (could
be the journal socket).
The proper fix is prctl(PR_SET_DUMPABLE, 1) after setuid, which restores
/proc/self/ ownership to the current uid.
Additionally, adds a `pipe-wrap` subcommand that wraps a child process
with piped stdout/stderr, relaying to the original FDs. This ensures all
descendants inherit pipes (which support re-opening via /proc/self/fd/N)
even when the outermost FDs are journal sockets. container-runtime.service
now uses this wrapper.
With pipe-wrap guaranteeing pipe-based FDs, the exec and launch non-TTY
paths no longer need their own pipe+relay threads, eliminating the bug
where exec would hang when a child daemonized (e.g. pg_ctl start).
- Pre-create and chown dump file for postgres user before pg_dump
- Chown volume mountpoint to postgres before initdb on restore
- Add --no-privileges to pg_restore to skip GRANT/REVOKE for missing roles
Implemented pipe FD handoff from exec to launch via Unix socket +
SCM_RIGHTS for grandchild log capture. Superseded by the simpler
PR_SET_DUMPABLE approach which eliminates the need for pipes entirely.
e2fsck returns 1 when errors are corrected and 2 when corrections
require a reboot. These are expected during ext4→btrfs conversion.
Only exit codes >= 4 indicate actual failure. Previously, .invoke()
treated any non-zero exit as an error, causing the conversion to
fail after successful filesystem repairs.
Two issues fixed:
1. Process group cascade: exec-command processes inherited the
container runtime's process group. When an entrypoint script
did kill(0, SIGTERM) during shutdown, it signaled ALL processes
in the group — including other subcontainers' launch wrappers,
causing their PID namespaces to collapse. Fixed by calling
setsid() in exec-command's pre_exec to isolate each service
in its own process group.
2. Unordered daemon termination: removeChild("main") fired
onLeaveContext callbacks for all Daemon.of() instances
simultaneously, bypassing Daemons.term()'s reverse-dependency
ordering. Fixed by having Daemons.build() mark individual
daemons as managed (suppressing their onLeaveContext) and
registering a single onLeaveContext that calls the ordered
Daemons.term(). The term() method is deduplicated so
system.stop() and onLeaveContext share the same shutdown.
The regex used `$` (end-of-string anchor) instead of no anchor,
so it never matched the percentage in rsync output. Every line,
including empty ones, was logged instead of parsed.
- Track the restart loop as an awaitable { abort, done } handle
- Remove shouldBeRunning flag — signal.aborted serves the same purpose
- Remove exiting field — term() awaits command termination inline
- Guard start() on loop existence to prevent concurrent restart loops
- Make backoff sleep abortable so term() returns immediately
- Suppress error logging during intentional termination
- Loop clears its own handle in finally block for natural exit (oneshot)
- Refactor HealthDaemon to use a tracked session (AbortController + awaitable
promise) instead of fire-and-forget health check loops, preventing health
checks from running after a service is stopped
- Stop health checks before terminating daemon to avoid false crash reports
during intentional shutdown
- Guard onExit callbacks with AbortSignal to prevent stale session callbacks
- Add logErrorOnce utility to deduplicate repeated error logging
- Fix SystemForEmbassy.stop() to capture clean promise before deleting ref
- Treat SIGTERM (signal 15) as successful exit in subcontainer sync
- Fix asError to return original Error instead of wrapping in new Error
- Remove unused ExtendedVersion import from Backups.ts
- Fix restoreBackup using backupOptions instead of restoreOptions
- Add missing await on preRestore/postRestore hooks
- Remove -c (checksum) flag that forced full reads on every run
- Add --partial to keep partially transferred files on interruption
- Add --inplace to avoid temp-file+rename metadata churn
- Add --timeout=300 to prevent hangs on stalled mounts
Adds a VPS restart button to the settings page, above logout. Shows a
spinner while the RPC completes, then a dialog telling the user to wait
1-2 minutes and refresh.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bug: After running an action (e.g. bitcoin's autoconfig), update_tasks was
called with the submitted form input — which for task-triggered actions is
filtered to only the task's fields (e.g. {zmqEnabled: true}). Other services'
tasks targeting the same action were then compared against this partial via
is_partial_of, so any task wanting a field NOT in the submission (e.g.
{blocknotify: "curl..."}) would incorrectly become active, even though the
full config still satisfied it.
This caused a cycling bug: running LND's autoconfig (zmqEnabled) would
activate Datum's task (blocknotify), and vice versa, despite the merge
correctly preserving both values in the config.
Fix: After running an action, fetch the full current config via
get_action_input (same as create_task and recheck_tasks already do) and
compare tasks against that.
The one-liner fix would have been to add a get_action_input call in the
RunAction handler. Instead, we extracted eval_action_tasks on
ServiceActorSeed — a single method that both RunAction and recheck_tasks
now call — because the duplication between these two sites is exactly how
this bug happened: recheck_tasks fetched the full config, RunAction didn't,
and they silently diverged.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bug: Setting a task input property to undefined (e.g. { prune: undefined })
to express "this key should be deleted" resulted in no task being created.
JSON.stringify strips undefined values, so { prune: undefined } serialized
as {}, and is_partial_of({}, any_config) always returns true — meaning
input-not-matches saw a "match" and never activated the task.
Fix (two parts):
- SDK: coerce undefined to null in task input values before serialization,
so they survive JSON.stringify and reach the Rust backend
- Rust: treat null in a partial as matching a missing key in the full
config, so tasks correctly deactivate when the key is already absent
Assumption: null and undefined/absent are semantically equivalent for
StartOS config values. Input specs produce concrete values (strings,
numbers, booleans, objects, arrays) — null never appears as a meaningful
distinct-from-absent value in real-world configs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Guard z.union() against empty arrays in dynamicSelect/dynamicMultiselect
by falling back to z.string() (fixes zod v4 _zod TypeError)
- Add smtpShape: typed zod schema for store file models, replacing
smtpInputSpec.validator which caused cross-zod-instance errors
- Bump version to 0.4.0-beta.62
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- add #[group(skip)] to all Parser-derived structs
- fix conflicts_with and arg definitions for correct CLI behavior
- refactor bin entry points to support manpage generation
Remove static wifi_interface/ethernet_interface fields from RpcContextSeed. Instead, look up
the wifi interface from the DB (populated by gateway sync) and check ethernet connectivity
by querying gateway entries. This ensures the wifi manager always uses the correct interface
even if network devices change after boot.
- COW snapshot (cp --reflink=always) of package volumes before
install/update; restore on failure, remove on success
- Automatic ext4→btrfs conversion via btrfs-convert during disk attach
with e2fsck pre-check and post-conversion defrag
- Probe package-data filesystem during setup.disk.list (on both disk
and partition level) so the UI can warn about ext4 conversion
- Setup wizard preserve-overwrite dialog shows ext4 warning with
backup acknowledgment checkbox before allowing preserve
The diff() method computes `compare - self`, not `self - compare`.
The reversed arguments caused all cert expiration times to resolve
to before the unix epoch, making getSslCertificate callbacks fire
immediately and infinitely on every registration.
Convert getServiceInterface, listServiceInterfaces, getSystemSmtp, and
getServiceManifest from manual callback triggers to DbWatchedCallbacks.
getServiceManifest now always returns the installed manifest.
Adds stack overflow backtraces, debug info compilation, and SSH password
auth for development. Reduces shutdown timeouts from 60s to 100ms for
faster iteration. Fixes race condition in NetService cleanup.
Implements DirectIoFile for faster package uploads by bypassing page cache.
Refactors RpcContinuations to support graceful WebSocket shutdown via
broadcast signal, improving stability during daemon restart.
These effects were passing the raw JS callback function through rpcRound
without converting it to a CallbackId via context.callbacks.addCallback().
Since functions are dropped by JSON.stringify, the Rust side never received
a callback, breaking the const() reactive pattern.
Update version references from Angular 20 to Angular 21 and Taiga UI to
Taiga UI 5 across architecture docs. Update web/CLAUDE.md with improved
Taiga golden rules: prioritize MCP server for docs, remove hardcoded
component examples in favor of live doc lookups.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move firmware config files to boot/firmware/ to match raspi-firmware
package layout in Debian Trixie
- Use nested mounts (firmware and efi inside boot) so squashfs boot
files land on the correct partitions without manual splitting
- Pre-calculate root partition size from squashfs instead of creating
oversized btrfs and shrinking (avoids ioctl failure on loop devices)
- Use named loop devices (/dev/startos-loop-*) with automatic cleanup
of stale devices from previous failed builds
- Use --rbind for /boot in upgrade scripts so nested mounts (efi,
firmware) are automatically carried into the chroot
Add a typed DbWatch at the end of add_tunnel and remove_tunnel that
waits up to 15s for the sync loop to commit the gateway state change
to patch-db before returning.
Replace the flush+add cycle in apply_policy_routing with ip route
replace for each desired route, then delete stale routes. This
eliminates the window where the per-interface routing table is empty,
which caused temporary connectivity loss on other gateways.
- Use generated TS types for tunnel API params and data models
- Simplify API service methods to use typed RPC calls
- Update port forward UI for optional labels
- Add TS derive and type annotations to all tunnel API param structs
- Export tunnel bindings to a tunnel/ subdirectory with index generation
- Change port forward label from String to Option<String>
- Add TunnelDatabase::init() with default subnet creation
- Add tunnel migration framework with m_00_port_forward_entry migration
to convert legacy string-only port forwards to the new entry format
The old raspberrypi.gpg.key has SHA1-only UID binding signatures,
which sqv (Sequoia PGP) on Trixie rejects as of 2026-02-01. Fetch the
key from the raspberrypi-archive-keyring package instead, which has
re-signed bindings using SHA-256/512.
Install a /etc/grub.d/07_startos_installer script that searches for a
.startos-installer marker file at boot. When found, it creates a
"StartOS Installer" menu entry that loads the USB's own grub.cfg via
configfile, making it the default with a 5-second timeout.
Uses configfile instead of chainloader because on hybrid ISOs the
.startos-installer marker and /boot/grub/grub.cfg are on the ISO9660
root partition, while the EFI binary lives on a separate embedded ESP.
chainloader would look for the EFI binary on the wrong partition.
Replace the serialized os_partitions field in ServerConfig with runtime
fstab parsing. OsPartitionInfo::from_fstab() resolves PARTUUID/UUID/LABEL
device specs via blkid and discovers the BIOS boot partition by scanning
for its GPT type GUID via lsblk.
Also removes the efibootmgr-based boot order management (replaced by
GRUB-based USB detection in a subsequent commit) and adds a dedicated
bios: Option<PathBuf> field for the unformatted BIOS boot partition.
Generate DKMS MOK key pair during OS install, sign all unsigned kernel
modules, and enroll the MOK certificate using the user's master password.
On reboot, MokManager prompts the user to complete enrollment. Re-enrolls
on every boot if the key exists but isn't enrolled yet. Adds setup wizard
dialog to inform the user about the MokManager prompt.
When a restart is requested while the service is already restarting
(stopped but not yet started), set restart_again so the actor will
perform another stop→start cycle after the current one completes.
Rename ifconfig_url to echoip_urls and iterate through configured URLs,
falling back to the next one on failure. Reduces timeout per attempt
from 10s to 5s.
Previously, traffic was only classified as private if the source IP was
in a known interface subnet. This prevented private access from VPNs on
different VLANs. Now all RFC 1918 IPv4 and ULA/link-local IPv6 addresses
are treated as private, and DNS resolution for private domains works for
these sources by returning IPs from all interfaces.
Unconditionally enabling serial terminal broke gfxterm on EFI systems
without a serial port. Now installs a /etc/grub.d/01_serial script
that probes for the serial port before enabling it. Also copies
unicode.pf2 font to boot partition for GRUB graphical mode.
- Update patch-db submodule: fixes DB null-nuke caused by ciborium's
broken deserialize_str, and stack overflow from recursive apply_patches
- Create /media/startos with mode 750 in initramfs before subdirectories
Add After/Wants network-online.target to prevent race where
start-tunneld starts before the network interface is up, causing
missing MASQUERADE rules. Rename `web reset` to `web uninit` for
clarity.
Eliminates boilerplate across 7 wrapper classes (GetContainerIp,
GetHostInfo, GetOutboundGateway, GetServiceManifest, GetSslCertificate,
GetStatus, GetSystemSmtp) by moving shared const/once/watch/onChange/
waitFor logic into an abstract Watchable<T> base class.
- Extract DbWatchedCallbacks<K> abstraction in callbacks.rs using SyncMutex
for the repeated patchdb subscribe-wait-fire-remove callback pattern
- Move get_host_info and get_status callbacks to use TypedDbWatch instead of
raw db.subscribe, eliminating race conditions between reading and watching
- Make getStatus return Option<StatusInfo> to handle uninstalled packages
- Add getStatus .const/.once/.watch/.onChange wrapper in container-runtime
for legacy SystemForEmbassy adapter
- Add SDK watchable wrapper classes for all callback-enabled effects:
GetStatus, GetServiceManifest, GetHostInfo, GetContainerIp, GetSslCertificate
Extract get_data_version into a shared function used by both effects
and service_map. Use the actual data version (instead of the previous
package version) when computing migration targets, and skip migrations
when the target range is unsatisfiable. Also detect install vs update
based on the presence of a data version file rather than load
disposition alone.
Adds a delete_dir helper that ignores NotFound errors (matching
the existing delete_file pattern) and replaces the repeated
metadata-check-then-remove_dir_all pattern throughout the codebase.
* task fix and keyboard fix
* fixes for build scripts
* passthrough feature
* feat: inline domain health checks and improve address UX
- addPublicDomain returns DNS query + port check results (AddPublicDomainRes)
so frontend skips separate API calls after adding a domain
- addPrivateDomain returns check_dns result for the gateway
- Support multiple ports per domain in validation modal (deduplicated)
- Run port checks concurrently via futures::future::join_all
- Add note to add-domain dialog showing other interfaces on same host
- Add addXForwardedHeaders to knownProtocols in SDK Host.ts
- Add plugin filter kind, pluginId filter, matchesAny, and docs to
getServiceInterface.ts
- Add PassthroughInfo type and passthroughs field to NetworkInfo
- Pluralize "port forwarding rules" in i18n dictionaries
* feat: add shared host note to private domain dialog with i18n
* fix: scope public domain to single binding and return single port check
Accept internalPort in AddPublicDomainParams to target a specific
binding. Disable the domain on all other bindings. Return a single
CheckPortRes instead of Vec. Revert multi-port UI to singular port
display from 0f8a66b35.
* better shared hostname approach, and improve look-feel of addresses tables
* fix starttls
* preserve usb as top efi boot option
* fix race condition in wan ip check
* sdk beta.56
* various bug, improve smtp
* multiple bugs, better outbound gateway UX
* remove non option from smtp for better package compat
* bump sdk
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* docs: update preferred external port design in TODO
* docs: add user-controlled public/private and port forward mapping to design
* docs: overhaul interfaces page design with view/manage split and per-address controls
* docs: move address enable/disable to overflow menu, add SSL indicator, defer UI placement decisions
* chore: remove tor from startos core
Tor is being moved from a built-in OS feature to a service. This removes
the Arti-based Tor client, onion address management, hidden service
creation, and all related code from the core backend, frontend, and SDK.
- Delete core/src/net/tor/ module (~2060 lines)
- Remove OnionAddress, TorSecretKey, TorController from all consumers
- Remove HostnameInfo::Onion and HostAddress::Onion variants
- Remove onion CRUD RPC endpoints and tor subcommand
- Remove tor key handling from account and backup/restore
- Remove ~12 tor-related Cargo dependencies (arti-client, torut, etc.)
- Remove tor UI components, API methods, mock data, and routes
- Remove OnionHostname and tor patterns/regexes from SDK
- Add v0_4_0_alpha_20 database migration to strip onion data
- Bump version to 0.4.0-alpha.20
* chore: flatten HostnameInfo from enum to struct
HostnameInfo only had one variant (Ip) after removing Tor. Flatten it
into a plain struct with fields gateway, public, hostname. Remove all
kind === 'ip' type guards and narrowing across SDK, frontend, and
container runtime. Update DB migration to strip the kind field.
* chore: format RPCSpec.md markdown table
* docs: update TODO.md with DerivedAddressInfo design, remove completed tor task
* feat: implement preferred port allocation and per-address enable/disable
- Add AvailablePorts::try_alloc() with SSL tracking (BTreeMap<u16, bool>)
- Add DerivedAddressInfo on BindInfo with private_disabled/public_enabled/possible sets
- Add Bindings wrapper with Map impl for patchdb indexed access
- Flatten HostAddress from single-variant enum to struct
- Replace set-gateway-enabled RPC with set-address-enabled
- Remove hostname_info from Host; computed addresses now in BindInfo.addresses.possible
- Compute possible addresses inline in NetServiceData::update()
- Update DB migration, SDK types, frontend, and container-runtime
* feat: replace InterfaceFilter with ForwardRequirements, add WildcardListener, complete alpha.20 bump
- Replace DynInterfaceFilter with ForwardRequirements for per-IP forward
precision with source-subnet iptables filtering for private forwards
- Add WildcardListener (binds [::]:port) to replace the per-gateway
NetworkInterfaceListener/SelfContainedNetworkInterfaceListener/
UpgradableListener infrastructure
- Update forward-port script with src_subnet and excluded_src env vars
- Remove unused filter types and listener infrastructure from gateway.rs
- Add availablePorts migration (IdPool -> BTreeMap<u16, bool>) to alpha.20
- Complete version bump to 0.4.0-alpha.20 in SDK and web
* outbound gateway support (#3120)
* Multiple (#3111)
* fix alerts i18n, fix status display, better, remove usb media, hide shutdown for install complete
* trigger chnage detection for localize pipe and round out implementing localize pipe for consistency even though not needed
* Fix PackageInfoShort to handle LocaleString on releaseNotes (#3112)
* Fix PackageInfoShort to handle LocaleString on releaseNotes
* fix: filter by target_version in get_matching_models and pass otherVersions from install
* chore: add exver documentation for ai agents
* frontend plus some be types
---------
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* feat: replace SourceFilter with IpNet, add policy routing, remove MASQUERADE
* build ts types and fix i18n
* fix license display in marketplace
* wip refactor
* chore: update ts bindings for preferred port design
* feat: refactor NetService to watch DB and reconcile network state
- NetService sync task now uses PatchDB DbWatch instead of being called
directly after DB mutations
- Read gateways from DB instead of network interface context when
updating host addresses
- gateway sync updates all host addresses in the DB
- Add Watch<u64> channel for callers to wait on sync completion
- Fix ts-rs codegen bug with #[ts(skip)] on flattened Plugin field
- Update SDK getServiceInterface.ts for new HostnameInfo shape
- Remove unnecessary HTTPS redirect in static_server.rs
- Fix tunnel/api.rs to filter for WAN IPv4 address
* re-arrange (#3123)
* new service interfacee page
* feat: add mdns hostname metadata variant and fix vhost routing
- Add HostnameMetadata::Mdns variant to distinguish mDNS from private domains
- Mark mDNS addresses as private (public: false) since mDNS is local-only
- Fall back to null SNI entry when hostname not found in vhost mapping
- Simplify public detection in ProxyTarget filter
- Pass hostname to update_addresses for mDNS domain name generation
* looking good
* feat: add port_forwards field to Host for tracking gateway forwarding rules
* update bindings for API types, add ARCHITECTURE (#3124)
* update binding for API types, add ARCHITECTURE
* translations
* fix: add CONNMARK restore-mark to mangle OUTPUT chain
The CONNMARK --restore-mark rule was only in PREROUTING, which handles
forwarded packets. Locally-bound listeners (e.g. vhost) generate replies
through the OUTPUT chain, where the fwmark was never restored. This
caused response packets to route via the default table instead of back
through the originating interface.
* chore: reserialize db on equal version, update bindings and docs
- Run de/ser roundtrip in pre_init even when db version matches, ensuring
all #[serde(default)] fields are populated before any typed access
- Add patchdb.md documentation for TypedDbWatch patterns
- Update TS bindings for CheckPortParams, CheckPortRes, ifconfigUrl
- Update CLAUDE.md docs with patchdb and component-level references
* fix: include public gateways for IP-based addresses in vhost targets
The server hostname vhost construction only collected private IPs,
always setting public to empty. Public IP addresses (Ipv4/Ipv6 metadata
with public=true) were never added to the vhost target's public gateway
set, causing the vhost filter to reject public traffic for IP-based
addresses.
* fix: add TLS handshake timeout and fix accept loop deadlock
Two issues in TlsListener::poll_accept:
1. No timeout on TLS handshakes: LazyConfigAcceptor waits indefinitely
for ClientHello. Attackers that complete TCP handshake but never send
TLS data create zombie futures in `in_progress` that never complete.
Fix: wrap the entire handshake in tokio::time::timeout(15s).
2. Missing waker on new-connection pending path: when a TCP connection
is accepted and the TLS handshake is pending, poll_accept returned
Pending without calling wake_by_ref(). Since the TcpListener returned
Ready (not Pending), no waker was registered for it. With edge-
triggered epoll and no other wakeup source, the task sleeps forever
and remaining connections in the kernel accept queue are never
drained. Fix: add cx.waker().wake_by_ref() so the task immediately
re-polls and continues draining the accept queue.
* fix: switch BackgroundJobRunner from Vec to FuturesUnordered
BackgroundJobRunner stored active jobs in a Vec<BoxFuture> and polled
ALL of them on every wakeup — O(n) per poll. Since this runs in the
same tokio::select! as the WebServer accept loop, polling overhead from
active connections directly delayed acceptance of new connections.
FuturesUnordered only polls woken futures — O(woken) instead of O(n).
* chore: update bindings and use typed params for outbound gateway API
* feat: per-service and default outbound gateway routing
Add set-outbound-gateway RPC for packages and set-default-outbound RPC
for the server, with policy routing enforcement via ip rules. Fix
connmark restore to skip packets with existing fwmarks, add bridge
subnet routes to per-interface tables, and fix squashfs path in
update-image-local.sh.
* refactor: manifest wraps PackageMetadata, move dependency_metadata to PackageVersionInfo
Manifest now embeds PackageMetadata via #[serde(flatten)] instead of
duplicating ~14 fields. icon and dependency_metadata moved from
PackageMetadata to PackageVersionInfo since they are registry-enrichment
data loaded from the S9PK archive. merge_with now returns errors on
metadata/icon/dependency_metadata mismatches instead of silently ignoring
them.
* fix: replace .status() with .invoke() for iptables/ip commands
Using .status() leaks stderr directly to system logs, causing noisy
iptables error messages. Switch all networking CLI invocations to use
.invoke() which captures stderr properly. For check-then-act patterns
(iptables -C), use .invoke().await.is_err() instead of
.status().await.map_or(false, |s| s.success()).
* feat: add check-dns gateway endpoint and fix per-interface routing tables
Add a `check-dns` RPC endpoint that verifies whether a gateway's DNS
is properly configured for private domain resolution. Uses a three-tier
check: direct match (DNS == server IP), TXT challenge probe (DNS on
LAN), or failure (DNS off-subnet).
Fix per-interface routing tables to clone all non-default routes from
the main table instead of only the interface's own subnets. This
preserves LAN reachability when the priority-75 catch-all overrides
default routing. Filter out status-only flags (linkdown, dead) that
are invalid for `ip route add`.
* refactor: rename manifest metadata fields and improve error display
Rename wrapperRepo→packageRepo, marketingSite→marketingUrl,
docsUrl→docsUrls (array), remove supportSite. Add display_src/display_dbg
helpers to Error. Fix DepInfo description type to LocaleString. Update
web UI, SDK bindings, tests, and fixtures to match. Clean up cli_attach
error handling and remove dead commented code.
* chore: bump sdk version to 0.4.0-beta.49
* chore: add createTask decoupling TODO
* chore: add TODO to clear service error state on install/update
* round out dns check, dns server check, port forward check, and gateway port forwards
* chore: add TODOs for URL plugins, NAT hairpinning, and start-tunnel OTA updates
* version instead of os query param
* interface row clickable again, bu now with a chevron!
* feat: implement URL plugins with table/row actions and prefill support
- Add URL plugin effects (register, export_url, clear_urls) in core
- Add PluginHostnameInfo, HostnameMetadata::Plugin, and plugin registration types
- Implement plugin URL table in web UI with tableAction button and rowAction overflow menus
- Thread urlPluginMetadata (packageId, hostId, interfaceId, internalPort) as prefill to actions
- Add prefill support to PackageActionData so metadata passes through form dialogs
- Add i18n translations for plugin error messages
- Clean up plugin URLs on package uninstall
* feat: split row_actions into remove_action and overflow_actions for URL plugins
* touch up URL plugins table
* show table even when no addresses
* feat: NAT hairpinning, DNS static servers, clear service error on install
- Add POSTROUTING MASQUERADE rules for container and host hairpin NAT
- Allow bridge subnet containers to reach private forwards via LAN IPs
- Pass bridge_subnet env var from forward.rs to forward-port script
- Use DB-configured static DNS servers in resolver with DB watcher
- Fall back to resolv.conf servers when no static servers configured
- Clear service error state when install/update completes successfully
- Remove completed TODO items
* feat: builder-style InputSpec API, prefill plumbing, and port forward fix
- Add addKey() and add() builder methods to InputSpec with InputSpecTools
- Move OuterType to last generic param on Value, List, and all dynamic methods
- Plumb prefill through getActionInput end-to-end (core → container-runtime → SDK)
- Filter port_forwards to enabled addresses only
- Bump SDK to 0.4.0-beta.50
* fix: propagate host locale into LXC containers and write locale.conf
* chore: remove completed URL plugins TODO
* feat: OTA updates for start-tunnel via apt repository (untested)
- Add apt repo publish script (build/apt/publish-deb.sh) for S3-hosted repo
- Add apt source config and GPG key placeholder (apt/)
- Add tunnel.update.check and tunnel.update.apply RPC endpoints
- Wire up update API in tunnel frontend (api service + mock)
- Uses systemd-run --scope to survive service restart during update
* fix: publish script dpkg-name, s3cfg fallback, and --reinstall for apply
* chore: replace OTA updates TODO with UI TODO for MattDHill
* feat: add getOutboundGateway effect and simplify VersionGraph init/uninit
Add getOutboundGateway effect across core, container-runtime, and SDK
to let services query their effective outbound gateway with callback
support. Remove preInstall/uninstall hooks from VersionGraph as they
are no longer needed.
* frontend start-tunnel updates
* chore: remove completed TODO
* feat: tor hidden service key migration
* chore: migrate from ts-matches to zod across all TypeScript packages
* feat(core): allow setting server hostname
* send prefill for tasks and hide operations to hidden fields
* fix(core): preserve plugin URLs across binding updates
BindInfo::update was replacing addresses with a new DerivedAddressInfo
that cleared the available set, wiping plugin-exported URLs whenever
bind() was called. Also simplify update_addresses plugin preservation
to use retain in place rather than collecting into a separate set.
* minor cleanup from patch-db audit
* clean up prefill flow
* frontend support for setting and changing hostname
* feat(core): refactor hostname to ServerHostnameInfo with name/hostname pair
- Rename Hostname to ServerHostnameInfo, add name + hostname fields
- Add set_hostname_rpc for changing hostname at runtime
- Migrate alpha_20: generate serverInfo.name from hostname, delete ui.name
- Extract gateway.rs helpers to fix rustfmt nesting depth issue
- Add i18n key for hostname validation error
- Update SDK bindings
* add comments to everything potentially consumer facing (#3127)
* add comments to everything potentially consumer facing
* rework smtp
---------
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* implement server name
* setup changes
* clean up copy around addresses table
* feat: add zod-deep-partial, partialValidator on InputSpec, and z.deepPartial re-export
* fix: header color in zoom (#3128)
* fix: merge version ranges when adding existing package signer (#3125)
* fix: merge version ranges when adding existing package signer
Previously, add_package_signer unconditionally inserted the new
version range, overwriting any existing authorization for that signer.
Now it OR-merges the new range with the existing one, so running
signer add multiple times accumulates permissions rather than
replacing them.
* add --merge flag to registry package signer add
Default behavior remains overwrite. When --merge is passed, the new
version range is OR-merged with the existing one, allowing admins to
accumulate permissions incrementally.
* add missing attribute to TS type
* make merge optional
* upsert instead of insert
* VersionRange::None on upsert
* fix: header color in zoom
---------
Co-authored-by: Dominion5254 <musashidisciple@proton.me>
* update snake and add about this server to system general
* chore: bump sdk to beta.53, wrap z.deepPartial with passthrough
* reset instead of reset defaults
* action failure show dialog
* chore: bump sdk to beta.54, add device-info RPC, improve SDK abort handling and InputSpec filtering
- Bump SDK version to 0.4.0-beta.54
- Add `server.device-info` RPC endpoint and `s9pk select` CLI command
- Extract `HardwareRequirements::is_compatible()` method, reuse in registry filtering
- Add `AbortedError` class with `muteUnhandled` flag, replace generic abort errors
- Handle unhandled promise rejections in container-runtime with mute support
- Improve `InputSpec.filter()` with `keepByDefault` param and boolean filter values
- Accept readonly tuples in `CommandType` and `splitCommand`
- Remove `sync_host` calls from host API handlers (binding/address changes)
- Filter mDNS hostnames by secure gateway availability
- Derive mDNS enabled state from LAN IPs in web UI
- Add "Open UI" action to address table, disable mDNS toggle
- Hide debug details in service error component
- Update rpc-toolkit docs for no-params handlers
* fix: add --no-nvram to efi grub-install to preserve built-in boot order
* update snake
* diable actions when in error state
* chore: split out nvidia variant
* misc bugfixes
* create manage-release script (untested)
* fix: preserve z namespace types for sdk consumers
* sdk version bump
* new checkPort types
* multiple bugs and better port forward ux
* fix link
* chore: todos and formatting
* fix build
---------
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Dominion5254 <musashidisciple@proton.me>
* fix: merge version ranges when adding existing package signer
Previously, add_package_signer unconditionally inserted the new
version range, overwriting any existing authorization for that signer.
Now it OR-merges the new range with the existing one, so running
signer add multiple times accumulates permissions rather than
replacing them.
* add --merge flag to registry package signer add
Default behavior remains overwrite. When --merge is passed, the new
version range is OR-merged with the existing one, allowing admins to
accumulate permissions incrementally.
* add missing attribute to TS type
* make merge optional
* upsert instead of insert
* VersionRange::None on upsert
* Fix PackageInfoShort to handle LocaleString on releaseNotes
* fix: filter by target_version in get_matching_models and pass otherVersions from install
* chore: add exver documentation for ai agents
* fix alerts i18n, fix status display, better, remove usb media, hide shutdown for install complete
* trigger chnage detection for localize pipe and round out implementing localize pipe for consistency even though not needed
* add documentation for ai agents
* docs: consolidate CLAUDE.md and CONTRIBUTING.md, add style guidelines
- Refactor CLAUDE.md to reference CONTRIBUTING.md for build/test/format info
- Expand CONTRIBUTING.md with comprehensive build targets, env vars, and testing
- Add code style guidelines section with conventional commits
- Standardize SDK prettier config to use single quotes (matching web)
- Add project-level Claude Code settings to disable co-author attribution
* style(sdk): apply prettier with single quotes
Run prettier across sdk/base and sdk/package to apply the
standardized quote style (single quotes matching web).
* docs: add USER.md for per-developer TODO filtering
- Add agents/USER.md to .gitignore (contains user identifier)
- Document session startup flow in CLAUDE.md:
- Create USER.md if missing, prompting for identifier
- Filter TODOs by @username tags
- Offer relevant TODOs on session start
* docs: add i18n documentation task to agent TODOs
* docs: document i18n ID patterns in core/
Add agents/i18n-patterns.md covering rust-i18n setup, translation file
format, t!() macro usage, key naming conventions, and locale selection.
Remove completed TODO item and add reference in CLAUDE.md.
* chore: clarify that all builds work on any OS with Docker
* fix --arch flag to fall back to emulation when native image unavailable, always infer hardware requirement for arch
* better handling of arch filter
* dont cancel in-progress commit workflows and abstract common setup
* cli improvements
fix group handling
* fix cli publish
* alpha.19
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* start consolidating
* add start-cli flash-os
* combine install and setup and refactor all
* use http
* undo mock
* fix translation
* translations
* use dialogservice wrapper
* better ST messaging on setup
* only warn on update if breakages (#3097)
* finish setup wizard and ui language-keyboard feature
* fix typo
* wip: localization
* remove start-tunnel readme
* switch to posix strings for language internal
* revert mock
* translate backend strings
* fix missing about text
* help text for args
* feat: add "Add new gateway" option (#3098)
* feat: add "Add new gateway" option
* Update web/projects/ui/src/app/routes/portal/components/form/controls/select.component.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* add translation
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* fix dns selection
* keyboard keymap also
* ability to shutdown after install
* revert mock
* working setup flow + manifest localization
* (mostly) redundant localization on frontend
* version bump
* omit live medium from disk list and better space management
* ignore missing package archive on 035 migration
* fix device migration
* add i18n helper to sdk
* fix install over 0.3.5.1
* fix grub config
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* port misc fixes from feature/nvidia
* switch back to official tor proxy on 9050
* refactor OpenUI
* fix typo
* fixes, plus getServiceManifest
* fix EffectCreator, bump to beta.47
* fixes
* help ios downlaod .crt and add begin add masked for addresses
* only require and show CA for public domain if addSsl
* fix type and revert i18n const
* feat: add address masking and adjust design (#3088)
* feat: add address masking and adjust design
* update lockfile
* chore: move eye button to actions
* chore: refresh notifications and handle action error
* static width for health check name
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* hide certificate authorities tab
* alpha.17
* add waiting health check status
* remove "on" from waiting message
* reject on abort in `.watch`
* id migration: nostr -> nostr-rs-relay
* health check waiting state
* use interface type for launch button
* better wording for masked
* cleaner
* sdk improvements
* fix type error
* fix notification badge issue
---------
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* fix: refactor dns to handle tcp connections:
- do not use long-lived tcp connections to upstream dns servers
- when incoming request is over tcp, force a tcp lookup instead of udp
this solves cases where large dns records were not being resolved due to udp->tcp switch-over.
* use forwarding resolver for fallback
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* fix: keep uptime width constant and service table DOM cached
* show error status and fix columns spacing
* revert const
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* add tor logs, rework services page, other small things
* feat: sortable service table and mobile view
---------
Co-authored-by: waterplea <alexander@inkin.ru>
* fix: race condition in Daemon.stop()
* fix: do not stop Daemon on context leave
* fix: remove duplicate Daemons.term calls
* feat: honor dependency order when shutting terminating Daemons
* fixes, and remove started
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* add support for idmapped mounts to start-sdk
* misc fixes
* misc fixes
* add default to textarea
* fix iptables masquerade rule
* fix textarea types
* more fixes
* better logging for rsync
* fix tty size
* fix wg conf generation for android
* disable file mounts on dependencies
* mostly there, some styling issues (#3069)
* mostly there, some styling issues
* fix: address comments (#3070)
* fix: address comments
* fix: fix
* show SSL for any address with secure protocol and ssl added
* better sorting and messaging
---------
Co-authored-by: Alex Inkin <alexander@inkin.ru>
* fixes for nextcloud
* allow sidebar navigation during service state traansitions
* wip: x-forwarded headers
* implement x-forwarded-for proxy
* lowercase domain names and fix warning popover bug
* fix http2 websockets
* fix websocket retry behavior
* add arch filters to s9pk pack
* use docker for start-cli install
* add version range to package signer on registry
* fix rcs < 0
* fix user information parsing
* refactor service interface getters
* disable idmaps
* build fixes
* update docker login action
* streamline build
* add start-cli workflow
* rename
* riscv64gc
* fix ui packing
* no default features on cli
* make cli depend on GIT_HASH
* more build fixes
* more build fixes
* interpolate arch within dockerfile
* fix tests
* add launch ui to service page plus other small improvements (#3075)
* add launch ui to service page plus other small improvements
* revert translation disable
* add spinner to service list if service is health and loading
* chore: some visual tune up
* chore: update Taiga UI
---------
Co-authored-by: waterplea <alexander@inkin.ru>
* fix backups
* feat: use arm hosted runners and don't fail when apt package does not exist (#3076)
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Shadowy Super Coder <musashidisciple@proton.me>
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Remco Ros <remcoros@live.nl>
* overwrite AllowedIPs in wg config
mute UnknownCA errors
* fix upgrade issues
* allow start9 user to access journal
* alpha.15
* sort actions lexicographically and show desc in marketplace details
* add registry package download cli command
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* tell user to restart server after kiosk chnage
* remove unused import
* dont show tor address on server setup
* chore: address comments
* revert mock
* chore: remove uptime block on mobile
* utiliser le futur proche
* chore: comments
* don't show loading on authorities tab
* chore: fix mobile unions
---------
Co-authored-by: waterplea <alexander@inkin.ru>
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* tell user to restart server after kiosk chnage
* remove unused import
* dont show tor address on server setup
* chore: address comments
* revert mock
* chore: remove uptime block on mobile
* utiliser le futur proche
---------
Co-authored-by: waterplea <alexander@inkin.ru>
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* refector addresses to not need gateways array
* fix dep error display, show starting if any health check starting, show disabled health check message, remove loader from service list, animated dots, better color
* fix: fix action results textfields
---------
Co-authored-by: waterplea <alexander@inkin.ru>
* add support for inbound proxies
* backend changes
* fix file type
* proxy -> tunnel, implement backend apis
* wip start-tunneld
* add domains and gateways, remove routers, fix docs links
* dont show hidden actions
* show and test dns
* edit instead of chnage acme and change gateway
* refactor: domains page
* refactor: gateways page
* domains and acme refactor
* certificate authorities
* refactor public/private gateways
* fix fe types
* domains mostly finished
* refactor: add file control to form service
* add ip util to sdk
* domains api + migration
* start service interface page, WIP
* different options for clearnet domains
* refactor: styles for interfaces page
* minor
* better placeholder for no addresses
* start sorting addresses
* best address logic
* comments
* fix unnecessary export
* MVP of service interface page
* domains preferred
* fix: address comments
* only translations left
* wip: start-tunnel & fix build
* forms for adding domain, rework things based on new ideas
* fix: dns testing
* public domain, max width, descriptions for dns
* nix StartOS domains, implement public and private domains at interface scope
* restart tor instead of reset
* better icon for restart tor
* dns
* fix sort functions for public and private domains
* with todos
* update types
* clean up tech debt, bump dependencies
* revert to ts-rs v9
* fix all types
* fix dns form
* add missing translations
* it builds
* fix: comments (#3009)
* fix: comments
* undo default
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* fix: refactor legacy components (#3010)
* fix: comments
* fix: refactor legacy components
* remove default again
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* more translations
* wip
* fix deadlock
* coukd work
* simple renaming
* placeholder for empty service interfaces table
* honor hidden form values
* remove logs
* reason instead of description
* fix dns
* misc fixes
* implement toggling gateways for service interface
* fix showing dns records
* move status column in service list
* remove unnecessary truthy check
* refactor: refactor forms components and remove legacy Taiga UI package (#3012)
* handle wh file uploads
* wip: debugging tor
* socks5 proxy working
* refactor: fix multiple comments (#3013)
* refactor: fix multiple comments
* styling changes, add documentation to sidebar
* translations for dns page
* refactor: subtle colors
* rearrange service page
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* fix file_stream and remove non-terminating test
* clean up logs
* support for sccache
* fix gha sccache
* more marketplace translations
* install wizard clarity
* stub hostnameInfo in migration
* fix address info after setup, fix styling on SI page, new 040 release notes
* remove tor logs from os
* misc fixes
* reset tor still not functioning...
* update ts
* minor styling and wording
* chore: some fixes (#3015)
* fix gateway renames
* different handling for public domains
* styling fixes
* whole navbar should not be clickable on service show page
* timeout getState request
* remove links from changelog
* misc fixes from pairing
* use custom name for gateway in more places
* fix dns parsing
* closes#3003
* closes#2999
* chore: some fixes (#3017)
* small copy change
* revert hardcoded error for testing
* dont require port forward if gateway is public
* use old wan ip when not available
* fix .const hanging on undefined
* fix test
* fix doc test
* fix renames
* update deps
* allow specifying dependency metadata directly
* temporarily make dependencies not cliackable in marketplace listings
* fix socks bind
* fix test
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
Co-authored-by: waterplea <alexander@inkin.ru>
* import marketplac preview for sideload
* fix: improve state service (#2977)
* fix: fix sideload DI
* fix: update Angular
* fix: cleanup
* fix: fix version selection
* Bump node version to fix build for Angular
* misc fixes
- update node to v22
- fix chroot-and-upgrade access to prune-images
- don't self-migrate legacy packages
- #2985
- move dataVersion to volume folder
- remove "instructions.md" from s9pk
- add "docsUrl" to manifest
* version bump
* include flavor when clicking view listing from updates tab
* closes#2980
* fix: fix select button
* bring back ssh keys
* fix: drop 'portal' from all routes
* fix: implement longtap action to select table rows
* fix description for ssh page
* replace instructions with docsLink and refactor marketplace preview
* delete unused translations
* fix patchdb diffing algorithm
* continue refactor of marketplace lib show components
* Booting StartOS instead of Setting up your server on init
* misc fixes
- closes#2990
- closes#2987
* fix build
* docsUrl and clickable service headers
* don't cleanup after update until new service install succeeds
* update types
* misc fixes
* beta.35
* sdkversion, githash for sideload, correct logs for init, startos pubkey display
* bring back reboot button on install
* misc fixes
* beta.36
* better handling of setup and init for websocket errors
* reopen init and setup logs even on graceful closure
* better logging, misc fixes
* fix build
* dont let package stats hang
* dont show docsurl in marketplace if no docsurl
* re-add needs-config
* show error if init fails, shorten hover state on header icons
* fix operator precedemce
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Mariusz Kogen <k0gen@pm.me>
* addHealthCheck on Daemons
* fix bug that prevents domains without protocols from being deleted
* fixes from testing
* version bump
* add sdk version to UI
* fix useEntrypoint
* fix dependency health check error display
* minor fixes
* beta.29
* fixes from testing
* beta.30
* set /etc/os-release (#2918)
* remove check-monitor from kiosk (#2059)
* add units for progress (#2693)
* use new progress type
* alpha.7
* fix up pwa stuff
* fix wormhole-squashfs and prune boot (#2964)
* don't exit on expected errors
* use bash
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* fix Tor logs actually fetching od logs
* chore: switch from `mime-types` to `mime` for browser environment support (#2951)
* change V2 s9pk title to Legacy
* show warning for domains when not public, disable launch too
---------
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Mariusz Kogen <k0gen@pm.me>
* fix typeo in patch db seed
* show all registries in updates tab, fix required dependnecy display in marketplace, update browser tab title desc
* always show pointer for version select
* chore: fix comments
* support html in action desc and marketplace long desc, only show qr in action res if qr is true
* disable save if smtp creds not edited, show better smtp success message
* dont dismiss login spinner until patchDB returns
* feat: redesign of service dashboard and interface (#2946)
* feat: redesign of service dashboard and interface
* chore: comments
* re-add setup complete
* dibale launch UI when not running, re-style things, rename things
* back to 1000
* fix clearnet docs link and require password retype in setup wiz
* faster hint display
* display dependency ID if title not available
* fix migration
* better init progress view
* fix setup success page by providing VERSION and notifications page fixes
* force uninstall from service error page, soft or hard
* handle error state better
* chore: fixed for install and setup wizards
* chore: fix issues (#2949)
* enable and disable kiosk mode
* minor fixes
* fix dependency mounts
* dismissable tasks
* provide replayId
* default if health check success message is null
* look for wifi interface too
* dash for null user agent in sessions
* add disk repair to diagnostic api
---------
Co-authored-by: waterplea <alexander@inkin.ru>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* adjust copy to display package state
* use package id for service column in notifications table
* fixes
* less translations, fix notificaiton item, remove unnecessary conditional
* tidy up
* forgot spanish
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* rmeove icon from toggles
* fix: comments
* fix: more comments
* always show public domains even if interface private, only show delete on domains
* fix: even more comments
* fix: last comments
* feat: empty state for dashboard
* rework welcome, dlete update-toast, minor
* translation improvements
---------
Co-authored-by: waterplea <alexander@inkin.ru>
* use docker for build steps that require linux when not on linux
* use fuse for overlay
* quiet mountpoint
* node 22
* misc fixes
* make shasum more compliant
* optimize download-base-image.sh with cleaner url handling and checksum verification
* fix script
* fixes#2900
* bump node and npm versions in web readme
* Minor pl.ts fixes
* fixes in response to synapse issues
* beta.8
* update ts-matches
* beta.11
* pl.ts finetuning
---------
Co-authored-by: Mariusz Kogen <k0gen@pm.me>
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* dynamically set a registry to use for os updates
* fix os updates response type
* fix saving high score
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* fix sideload and install flow
* move updates chevron inside upddate button
* update dictionaries to include langauge names
* fix: address todos (#2880)
* fix: address todos
* fix enlgish translation
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* use existing translation, no need to duplicate
* fix: update dialog and other fixes (#2882)
---------
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* Refactor i18n approach
* chore: move to shared
* chore: add default
* create DialogService and update LoadingService (#2876)
* complete translation infra for ui project, currently broken
* cleanup and more dictionaries
* chore: fix
---------
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* fix initiall setup as user and clear messaging
* fix this and that :)
* add IPv6 support to validate_ip function
* Use vpn-clearnet as name for the interface
* Rebrand and finish with docs link
* set static clearnet name
* Magic clearnet to the end :D
* change the command name
* the name is magic-clearnet
* wireguard-vps-proxy-setup
* one more fix
* feat: finalize desktop and mobile design of system routes
* clean up messaging and mobile tabbar utilities
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* feat: add i18n infrastructure
* store langauge selection to patchDB ui section
* feat: react to patchdb language change
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* small type changes and clear todos
* handle notifications and metrics
* wip
* fixes
* migration
* dedup all urls
* better handling of clearnet ips
* add rfkill dependency
* chore: refactor settings
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* small type changes and clear todos
* handle notifications and metrics
* wip
* fixes
* migration
* dedup all urls
* better handling of clearnet ips
* add rfkill dependency
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* fix issues with legacy packages
* include non-prerelease versions within compat range
* lock sdk to corresponding os prerelease
* bump sdk version
* fixes from PR review
* feat: redesign service route
* chore: more changes
* remove automated backups and fix interface addresses
* fix rpc methods and slightly better mocks
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* fix web manifest format error
* fix setting optional dependencies
* rework dependency actions to be nested
* fix styling
* fix styles
* combine action requests into same component
* only display actions header if they exist
* fix storing polyfill dependencies
* fix styling and button propagation
* fixes for setting polyfill dependencies
* revert to test
* revert required deps setting logic
* add logs and adjust logic
* test
* fix deps logic when changing config
* remove logs; deps working as expected
* miscellaneous bugfixes for alpha12
* fix deserialization of path in cifs share
* catch error in setup.status
* actually reserialize db after migration
* better progress reporting for migrations
* fix infinite drop
* fix raspi build
* fix race condition
* version bump
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* feat: add WireGuard VPS setup automation script
Adds a comprehensive bash script that automates:
- SSH key setup and authentication
- WireGuard installation on remote VPS
- Configuration download and import to NetworkManager
- User-friendly CLI interface with validation
- Detailed status messages and error handling
- Instructions for exposing services via ACME/Let's Encrypt
* use cat heredoc for issue files to fix formatting
Replaces echo with cat heredoc when writing to /etc/issue and /etc/issue.net to properly preserve escape sequences and prevent unwanted newlines in login prompts.
* add convent `wg-vps-setup` symlink to PATH
* sync ssh privkey on init
* Update default ssh key location
* simplify to use existing StartOS SSH keys and fix .ssh permission
* finetune
* Switch to start9labs repo
* rename some files
* set correct ownership
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* add clearnet functionality to frontend
* add pattern and add sync db on rpcs
* add domain pattern
* show acme name instead of url if known
* dont blow up if domain not present after delete
* use common name for letsencrypt
* normalize urls
* refactor start-os ui net service
* backend migration and rpcs for serverInfo.host
* fix cors
* implement clearnet for main startos ui
* ability to add and remove tor addresses, including vanity
* add guard to prevent duplicate addresses
* misc bugfixes
* better heuristics for launching UIs
* fix ipv6 mocks
* fix ipv6 display bug
* rewrite url selection for launch ui
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* add smtp to frontend
* left align headers
* just email
* change all to email
* fix test-smtp api
* types
* fix email from and login address handling
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* retry logic for init status
* fix login flashing and sideload hanging
* add logging
* misc backend bugfixes
* use closingObserver instead
* always show reinstall button
* go back to endWith
* show error if sideload fails
* refactor more watch channels
* navigate to services page on sideload complete
* handle error closure events properly
* handle error scenario better in sideload websocket
* remove a clone
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* use notification system for OS updates
* feat: Include the version update notification in the update in rs
* chore: Change the location of the comment
* progress on release notes
* fill out missing sections
* fix build
* fix build
---------
Co-authored-by: J H <dragondef@gmail.com>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* Add gather_debug_info.sh for comprehensive StartOS diagnostics
* chore: Update the services to use the lxc instead of podman
* chore: Add symlink /usr/bin/gather-debug
---------
Co-authored-by: Jade <2364004+Blu-J@users.noreply.github.com>
* add support for ACME cert acquisition
* add support for modifying hosts for a package
* misc fixes
* more fixes
* use different port for lan clearnet than wan clearnet
* fix chroot-and-upgrade always growing
* bail on failure
* wip
* fix alpn auth
* bump async-acme
* fix cli
* add barebones documentation
* add domain to hostname info
* sdk input spec improvements
* more sdk changes
* fe changes
* alpha.14
* fix tests
* separate validator in filehelper
* use deeppartial for getinput
* fix union type and update ts-matches
* alpha.15
* alpha.16
* alpha.17
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* wip(fix): Working on fixing the migration.
* get s9pk compat key
* wip: Change to just using the archive to not use the manifest parsing.
* fix: Fix the rebuild
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* wip
* wip: Adding more of the docker for the mac build
* fix: Running a build
* chore: Make the code a little cleaner
* optimize: reduce docker image size for mac-tar2sqfs
* feat: Update sdk-utils container usage and Dockerfile
* feat: Publish SDK Utils Container image
* clean up ...
* feat: Add manual input to control tagging Docker image as 'latest'
* fix: Update workflow input handling
* switch to different repo and clean
---------
Co-authored-by: Mariusz Kogen <k0gen@pm.me>
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* sdk tweaks
* update action result types
* accommodate new action response types
* fix: show action value labels
* Feature/get status effect (#2765)
* wip: get status
* feat: Add the get_status for effects
* feat: Do a callback
---------
Co-authored-by: J H <dragondef@gmail.com>
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: waterplea <alexander@inkin.ru>
Co-authored-by: J H <dragondef@gmail.com>
* chore: convert to use a value, cause why not
* wip: Add the up for this going up
* wip: trait changes
* wip: Add in some more of the private transformations
* chore(wip): Adding the ssh_keys todo
* wip: Add cifs
* fix migration structure
* chore: Fix the trait for the version
* wip(feat): Notifications are in the system
* fix marker trait hell
* handle key todos
* wip: Testing the migration in a system.
* fix pubkey parser
* fix: migration works
* wip: Trying to get the migration stuff?
* fix: Can now install the packages that we wanted, yay!"
* Merge branch 'next/minor' of github.com:Start9Labs/start-os into feat/migration
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* add with_about for echo, server, and auth
* update for feedback
* finish (most) remaining command documentation
* update comments after additional clarification
* add expanded_api descriptions
* add comments for action_api
* add comments for remaining apis
* add comment for package-rebuild
* fix build errors
* missed one with_about
* add context to git-info subcommands
* remove context from git-info subcommands
* Make git-info from_fns generic over context
* make version::git_info generic over the context
* try removing generics from subcommand and version::git_info
* try adding a closure with context
* Updates for reviewer feedback
* update abstract marketplace for usage accuracy andrename store to registry
* use new abstract functions
* fix(marketplace): get rid of `AbstractMarketplaceService`
* bump shared marketplace lib
* update marketplace to use query params for registry url; comment out updates page - will be refactored
* cleanup
* cleanup duplicate
* cleanup unused imports
* rework setting registry url when loading marketplace
* cleanup marketplace service
* fix background
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: waterplea <alexander@inkin.ru>
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
* add error status
* update types
* ṗ̶̰̙̓͒̈́ͅü̵̢̙̫̣ŗ̷̪̺̺͛g̴̲͉͎̬̒̇e̵̪̎̅͌ ̶̡̜̘͐͛t̶͎͍̣̿̍̐h̴͕̩͗̈́̎̑e̵͚͒̂͝ ̸̛͙̦͈͝v̶̱͙̬̽̔ọ̶̧̡̒̓i̸̬̲͍̋̈́d̴͉̀
* fix some extra voids
* add `package.rebuild`
* introduce error status and pkg rebuild and fix mocks
* minor fixes
* fix build
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* store, properties, manifest
* interfaces
* init and backups
* fix init and backups
* file models
* more versions
* dependencies
* config except dynamic types
* clean up config
* remove disabled from non-dynamic vaues
* actions
* standardize example code block formats
* wip: actions refactor
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* commit types
* fix types
* update types
* update action request type
* update apis
* add description to actionrequest
* clean up imports
* revert package json
* chore: Remove the recursive to the index
* chore: Remove the other thing I was testing
* flatten action requests
* update container runtime with new config paradigm
* new actions strategy
* seems to be working
* misc backend fixes
* fix fe bugs
* only show breakages if breakages
* only show success modal if result
* don't panic on failed removal
* hide config from actions page
* polyfill autoconfig
* use metadata strategy for actions instead of prev
* misc fixes
* chore: split the sdk into 2 libs (#2736)
* follow sideload progress (#2718)
* follow sideload progress
* small bugfix
* shareReplay with no refcount false
* don't wrap sideload progress in RPCResult
* dont present toast
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* chore: Add the initial of the creation of the two sdk
* chore: Add in the baseDist
* chore: Add in the baseDist
* chore: Get the web and the runtime-container running
* chore: Remove the empty file
* chore: Fix it so the container-runtime works
---------
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* misc fixes
* update todos
* minor clean up
* fix link script
* update node version in CI test
* fix node version syntax in ci build
* wip: fixing callbacks
* fix sdk makefile dependencies
* add support for const outside of main
* update apis
* don't panic!
* Chore: Capture weird case on rpc, and log that
* fix procedure id issue
* pass input value for dep auto config
* handle disabled and warning for actions
* chore: Fix for link not having node_modules
* sdk fixes
* fix build
* fix build
* fix build
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
Co-authored-by: J H <dragondef@gmail.com>
Co-authored-by: Jade <2364004+Blu-J@users.noreply.github.com>
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
* add support for remote attaching to container
* feature: Add in the subcontainer searching
* feat: Add in the name/ imageId filtering
* Feat: Fix the env and the workdir
* chore: Make the sigkill first?
* add some extra guard on term
* fix: Health during error doesnt return what we need
* chore: Cleanup for pr
* fix build
* fix build
* Update startos-iso.yaml
* Update startos-iso.yaml
* Update startos-iso.yaml
* Update startos-iso.yaml
* Update startos-iso.yaml
* Update startos-iso.yaml
* Update startos-iso.yaml
* check status during build
---------
Co-authored-by: J H <dragondef@gmail.com>
* fix: No error's with an error code
* fix dns query
* await resolv.conf copy
* use tty in subcontainer exec if parent is tty
* Fix: Home=root for inject services
* fix: Add the action inject too
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* fix mac build
* additional fixes
* handle arm64 from uname -m
* handle arm64 from uname -m in all builds
* gracefully handle rootless docker
* use cross-platform method of determining file uid
Currently the start sdk that we expose calls some of the effects. And
there are others that need to be called via the effects object. The
idea is that all the effects that could and should be called are from
the startsdk side
Actions where running in a race condition that they sometimes didn't wait for the container to be started and the issue was the exec that was then run after would have an issue.
* chore: reimplement refactor for the changes
* chore: Make it so even more cases are caught on the transformation
* Update container-runtime/src/Adapters/Systems/SystemForEmbassy/index.ts
* chore: Update the types of the action result because it wasnt matching what was in the action.rs
* create version graph to handle migrations
* Fix some version alpha test
* connect dataVersion api
* rename init fns
* improve types and add tests
* set data version after backup restore
* chore: Add some types tests for version info
* wip: More changes to versionInfo tests
* wip: fix my stupid
* update mocks
* update runtime
* chore: Fix the loop
---------
Co-authored-by: Jade <2364004+Blu-J@users.noreply.github.com>
Co-authored-by: J H <dragondef@gmail.com>
* feature: Make all errors in console.error be including an error for that stack tract
* feature: Make all errors in console.error be including an error for that stack tract
* fix: Add the tinisubreaper for the subreapers to know they are not the reaper
* fix: overlay always destroyed
* chore: Move the style of destroy to just private
* add loggedIn key to sessions
* show loggedIn timestamp in list
* don't double hash active session
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* feature: Adding in the stopping state
* chore: Deal with timeout in the sigterm for main
* chore: Update the timeout
* Update web/projects/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.ts
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* Update web/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
---------
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* fix master build (#2639)
* feat: Change ts to use rsync
Chore: Update the ts to use types over interface
* feat: Get the rust and the js to do a backup
* Wip: Got the backup working?
* fix permissions
* remove trixie list
* update tokio to fix timer bug
* fix error handling on backup
* wip
* remove idmap
* run restore before init, and init with own version on restore
---------
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* port 040 config, WIP
* update fixtures
* use taiga modal for backups too
* fix: update Taiga UI and refactor everything to work
* chore: package-lock
* fix interfaces and mocks for interfaces
* better mocks
* function to transform old spec to new
* delete unused fns
* delete unused FE config utils
* fix exports from sdk
* reorganize exports
* functions to translate config
* rename unionSelectKey and unionValueKey
* new backup fs
* update sdk types
* change types, include fuse module
* fix casing
* rework setup wiz
* rework UI
* only fuse3
* fix arm build
* misc fixes
* fix duplicate server select
* fix: fix throwing inside dialog
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: waterplea <alexander@inkin.ru>
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
* port 040 config, WIP
* update fixtures
* use taiga modal for backups too
* fix: update Taiga UI and refactor everything to work
* chore: package-lock
* fix interfaces and mocks for interfaces
* better mocks
* function to transform old spec to new
* delete unused fns
* delete unused FE config utils
* fix exports from sdk
* reorganize exports
* functions to translate config
* rename unionSelectKey and unionValueKey
* Adding in the transformation of the getConfig to the new types.
* chore: add Taiga UI to preloader
---------
Co-authored-by: waterplea <alexander@inkin.ru>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
Co-authored-by: J H <dragondef@gmail.com>
* fix mac build
* wip
* chore: Update the effects to get rid of bad pattern
* chore: Some small changes
* wip
* fix: Health checks don't show during race
* fix: Restart working
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* fix mac build
* wip
* chore: Update the effects to get rid of bad pattern
* chore: Some small changes
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* Feature: Add in the clear bindings
* wip: Working on network
* fix: Make it so the config gives the url
* chore: Remove the repeated types
* chore: Add in the todo's here
* chore: UPdate and remove some poorly name var
* chore: Remove the clear-bindings impl
* chore: Remove the wrapper
* handle HostnameInfo for Host bindings
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* ??
* chore: Make the install work
* Fix: Url's not being created
* chore: Fix the local onion in url
* include port in hostname
* Chore of adding a comment just to modify.
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* complete get_primary_url fn
* complete clear_network_interfaces fn
* formatting
* complete remove_address fn
* get_system_smtp wip
* complete get_system_smtp and set_system_smtp
* add SetSystemSmtpParams struct
* add set_system_smtp subcommand
* Remove 'Copy' implementation from `HostAddress`
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* Refactor `get_host_primary` fn and clone resulting `HostAddress`
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* misc fixes and debug info
* seed hosts with a tor address
* fix: Making the daemons keep up the status.
* wipFix: Making a service start
* fix: Both the start + stop of the service.
* fix: Weird edge case of failure and kids
---------
Co-authored-by: Shadowy Super Coder <musashidisciple@proton.me>
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* feat: Implementation on the backup for the service.
* wip: Getting the flow of backup/restore
* feat: Recover
* Feature: Commit the full pass on the backup restore.
* use special type for backup instead of special id (#2614)
* fix: Allow compat docker style to run again
* fix: Backup for the js side
* chore: Update some of the callbacks
---------
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
* update registry upload to take id for new admin permissions (#2605)
* wip
* wip: Get the get dependencies
* wip check_dependencies
* wip: Get the build working to the vm
* wip: Add in the last of the things that where needed for the new sdk
* Add fix
* wip: implement the changes
* wip: Fix the naming
---------
Co-authored-by: Lucy <12953208+elvece@users.noreply.github.com>
* wip: Working on something to help
* chore: Add in some of the logging now
* chore: fix the type to interned instead of id
* wip
* wip
* chore: fix the logging by moving levels
* Apply suggestions from code review
* mount at machine id for journal
* Persistant
* limit log size
* feat: Actually logging and mounting now
* fix: Get the logs from the previous versions of the boot
* Chore: Add the boot id
---------
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* feat: Add the implementation of the rest of the polyfillEffects
* chore: Add in the rsync
* chore: Add in the changes needed to indicate that the service does not need config
* fix: Vaultwarden sets, starts, stops, uninstalls
* chore: Update the polyFilleffect and add two more
* Update MainLoop.ts
* chore: Add in the set config of the deps on the config set
* make category link generic
* fix ai category display and svg icons
* fix markdown display and ansi module; cleanup
* convert tailwindcss to scss in marketplace menu component
* convert tailwindcss to scss in marketplace categories component
* convert tailwindcss to scss in marketplace item component
* update launch icon to taiga icon
* convert tailwindcss to scss in marketplace search component + cleanup
* convert tailwindcss to scss in marketplace release notes component + cleanup
* convert tailwindcss to scss in marketplace about component + cleanup
* convert tailwindcss to scss in marketplace additional component
* convert tailwindcss to scss in marketplace dependencies component + misc style fixes
* convert tailwindcss to scss in marketplace hero component + misc style fixes
* convert tailwindcss to scss in marketplace screenshots component
* convert tailwindcss to scss in portal marketplace components
* remove the rest of tailwindscss and fix reset styles
* bump shared and marketplace package versions
* misc style + build fixes
* sync package lock
* fix markdown + cleanup
* fix markdown margins and git hash size
* fix mobile zindex for hero and mobile changing categories routing link
* wip: move postgres data to patchdb
* wip
* wip
* wip
* complete notifications and clean up warnings
* fill in user agent
* move os tor bindings to single call
* new interfaces and remove tor http warnings
* move sigtermTimeout to stopping main status
* lightning, masked, schemeOverride, invert host-iface relationship
* update for new sdk
* update for latest SDK changes
* Update app-interfaces.page.ts
* Update config.service.ts
* wip: context
* wip(fix) Sorta auth
* wip: warnings
* wip(fix): registry/admin
* wip(fix) marketplace
* wip(fix) Some more converted and fixed with the linter and config
* wip: Working on the static server
* wip(fix)static server
* wip: Remove some asynnc
* wip: Something about the request and regular rpc
* wip: gut install
Co-authored-by: J H <Blu-J@users.noreply.github.com>
* wip: Convert the static server into the new system
* wip delete file
* test
* wip(fix) vhost does not need the with safe defaults
* wip: Adding in the wifi
* wip: Fix the developer and the verify
* wip: new install flow
Co-authored-by: J H <Blu-J@users.noreply.github.com>
* fix middleware
* wip
* wip: Fix the auth
* wip
* continue service refactor
* feature: Service get_config
* feat: Action
* wip: Fighting the great fight against the borrow checker
* wip: Remove an error in a file that I just need to deel with later
* chore: Add in some more lifetime stuff to the services
* wip: Install fix on lifetime
* cleanup
* wip: Deal with the borrow later
* more cleanup
* resolve borrowchecker errors
* wip(feat): add in the handler for the socket, for now
* wip(feat): Update the service_effect_handler::action
* chore: Add in the changes to make sure the from_service goes to context
* chore: Change the
* refactor service map
* fix references to service map
* fill out restore
* wip: Before I work on the store stuff
* fix backup module
* handle some warnings
* feat: add in the ui components on the rust side
* feature: Update the procedures
* chore: Update the js side of the main and a few of the others
* chore: Update the rpc listener to match the persistant container
* wip: Working on updating some things to have a better name
* wip(feat): Try and get the rpc to return the correct shape?
* lxc wip
* wip(feat): Try and get the rpc to return the correct shape?
* build for container runtime wip
* remove container-init
* fix build
* fix error
* chore: Update to work I suppose
* lxc wip
* remove docker module and feature
* download alpine squashfs automatically
* overlays effect
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* chore: Add the overlay effect
* feat: Add the mounter in the main
* chore: Convert to use the mounts, still need to work with the sandbox
* install fixes
* fix ssl
* fixes from testing
* implement tmpfile for upload
* wip
* misc fixes
* cleanup
* cleanup
* better progress reporting
* progress for sideload
* return real guid
* add devmode script
* fix lxc rootfs path
* fix percentage bar
* fix progress bar styling
* fix build for unstable
* tweaks
* label progress
* tweaks
* update progress more often
* make symlink in rpc_client
* make socket dir
* fix parent path
* add start-cli to container
* add echo and gitInfo commands
* wip: Add the init + errors
* chore: Add in the exit effect for the system
* chore: Change the type to null for failure to parse
* move sigterm timeout to stopping status
* update order
* chore: Update the return type
* remove dbg
* change the map error
* chore: Update the thing to capture id
* chore add some life changes
* chore: Update the loging
* chore: Update the package to run module
* us From for RpcError
* chore: Update to use import instead
* chore: update
* chore: Use require for the backup
* fix a default
* update the type that is wrong
* chore: Update the type of the manifest
* chore: Update to make null
* only symlink if not exists
* get rid of double result
* better debug info for ErrorCollection
* chore: Update effects
* chore: fix
* mount assets and volumes
* add exec instead of spawn
* fix mounting in image
* fix overlay mounts
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* misc fixes
* feat: Fix two
* fix: systemForEmbassy main
* chore: Fix small part of main loop
* chore: Modify the bundle
* merge
* fixMain loop"
* move tsc to makefile
* chore: Update the return types of the health check
* fix client
* chore: Convert the todo to use tsmatches
* add in the fixes for the seen and create the hack to allow demo
* chore: Update to include the systemForStartOs
* chore UPdate to the latest types from the expected outout
* fixes
* fix typo
* Don't emit if failure on tsc
* wip
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* add s9pk api
* add inspection
* add inspect manifest
* newline after display serializable
* fix squashfs in image name
* edit manifest
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* wait for response on repl
* ignore sig for now
* ignore sig for now
* re-enable sig verification
* fix
* wip
* env and chroot
* add profiling logs
* set uid & gid in squashfs to 100000
* set uid of sqfs to 100000
* fix mksquashfs args
* add env to compat
* fix
* re-add docker feature flag
* fix docker output format being stupid
* here be dragons
* chore: Add in the cross compiling for something
* fix npm link
* extract logs from container on exit
* chore: Update for testing
* add log capture to drop trait
* chore: add in the modifications that I make
* chore: Update small things for no updates
* chore: Update the types of something
* chore: Make main not complain
* idmapped mounts
* idmapped volumes
* re-enable kiosk
* chore: Add in some logging for the new system
* bring in start-sdk
* remove avahi
* chore: Update the deps
* switch to musl
* chore: Update the version of prettier
* chore: Organize'
* chore: Update some of the headers back to the standard of fetch
* fix musl build
* fix idmapped mounts
* fix cross build
* use cross compiler for correct arch
* feat: Add in the faked ssl stuff for the effects
* @dr_bonez Did a solution here
* chore: Something that DrBonez
* chore: up
* wip: We have a working server!!!
* wip
* uninstall
* wip
* tes
* misc fixes
* fix cli
* replace interface with host
* chore: Fix the types in some ts files
* chore: quick update for the system for embassy to update the types
* replace br-start9 with lxcbr0
* split patchdb into public/private
* chore: Add changes for config set
* Feat: Adding some debugging for the errors
* wip: Working on getting the set config to work
* chore: Update and fix the small issue with the deserialization
* lightning, masked, schemeOverride, invert host-iface relationship
* feat: Add in the changes for just the sdk
* feat: Add in the changes for the new effects I suppose for now
* Some small changes ????
---------
Co-authored-by: J H <2364004+Blu-J@users.noreply.github.com>
Co-authored-by: J H <Blu-J@users.noreply.github.com>
Co-authored-by: J H <dragondef@gmail.com>
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* wip(fix): Dependencies
* wip: context
* wip(fix) Sorta auth
* wip: warnings
* wip(fix): registry/admin
* wip(fix) marketplace
* wip(fix) Some more converted and fixed with the linter and config
* wip: Working on the static server
* wip(fix)static server
* wip: Remove some asynnc
* wip: Something about the request and regular rpc
* wip: gut install
Co-authored-by: J H <Blu-J@users.noreply.github.com>
* wip: Convert the static server into the new system
* wip delete file
* test
* wip(fix) vhost does not need the with safe defaults
* wip: Adding in the wifi
* wip: Fix the developer and the verify
* wip: new install flow
Co-authored-by: J H <Blu-J@users.noreply.github.com>
* fix middleware
* wip
* wip: Fix the auth
* wip
* continue service refactor
* feature: Service get_config
* feat: Action
* wip: Fighting the great fight against the borrow checker
* wip: Remove an error in a file that I just need to deel with later
* chore: Add in some more lifetime stuff to the services
* wip: Install fix on lifetime
* cleanup
* wip: Deal with the borrow later
* more cleanup
* resolve borrowchecker errors
* wip(feat): add in the handler for the socket, for now
* wip(feat): Update the service_effect_handler::action
* chore: Add in the changes to make sure the from_service goes to context
* chore: Change the
* refactor service map
* fix references to service map
* fill out restore
* wip: Before I work on the store stuff
* fix backup module
* handle some warnings
* feat: add in the ui components on the rust side
* feature: Update the procedures
* chore: Update the js side of the main and a few of the others
* chore: Update the rpc listener to match the persistant container
* wip: Working on updating some things to have a better name
* wip(feat): Try and get the rpc to return the correct shape?
* lxc wip
* wip(feat): Try and get the rpc to return the correct shape?
* build for container runtime wip
* remove container-init
* fix build
* fix error
* chore: Update to work I suppose
* lxc wip
* remove docker module and feature
* download alpine squashfs automatically
* overlays effect
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* chore: Add the overlay effect
* feat: Add the mounter in the main
* chore: Convert to use the mounts, still need to work with the sandbox
* install fixes
* fix ssl
* fixes from testing
* implement tmpfile for upload
* wip
* misc fixes
* cleanup
* cleanup
* better progress reporting
* progress for sideload
* return real guid
* add devmode script
* fix lxc rootfs path
* fix percentage bar
* fix progress bar styling
* fix build for unstable
* tweaks
* label progress
* tweaks
* update progress more often
* make symlink in rpc_client
* make socket dir
* fix parent path
* add start-cli to container
* add echo and gitInfo commands
* wip: Add the init + errors
* chore: Add in the exit effect for the system
* chore: Change the type to null for failure to parse
* move sigterm timeout to stopping status
* update order
* chore: Update the return type
* remove dbg
* change the map error
* chore: Update the thing to capture id
* chore add some life changes
* chore: Update the loging
* chore: Update the package to run module
* us From for RpcError
* chore: Update to use import instead
* chore: update
* chore: Use require for the backup
* fix a default
* update the type that is wrong
* chore: Update the type of the manifest
* chore: Update to make null
* only symlink if not exists
* get rid of double result
* better debug info for ErrorCollection
* chore: Update effects
* chore: fix
* mount assets and volumes
* add exec instead of spawn
* fix mounting in image
* fix overlay mounts
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* misc fixes
* feat: Fix two
* fix: systemForEmbassy main
* chore: Fix small part of main loop
* chore: Modify the bundle
* merge
* fixMain loop"
* move tsc to makefile
* chore: Update the return types of the health check
* fix client
* chore: Convert the todo to use tsmatches
* add in the fixes for the seen and create the hack to allow demo
* chore: Update to include the systemForStartOs
* chore UPdate to the latest types from the expected outout
* fixes
* fix typo
* Don't emit if failure on tsc
* wip
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* add s9pk api
* add inspection
* add inspect manifest
* newline after display serializable
* fix squashfs in image name
* edit manifest
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* wait for response on repl
* ignore sig for now
* ignore sig for now
* re-enable sig verification
* fix
* wip
* env and chroot
* add profiling logs
* set uid & gid in squashfs to 100000
* set uid of sqfs to 100000
* fix mksquashfs args
* add env to compat
* fix
* re-add docker feature flag
* fix docker output format being stupid
* here be dragons
* chore: Add in the cross compiling for something
* fix npm link
* extract logs from container on exit
* chore: Update for testing
* add log capture to drop trait
* chore: add in the modifications that I make
* chore: Update small things for no updates
* chore: Update the types of something
* chore: Make main not complain
* idmapped mounts
* idmapped volumes
* re-enable kiosk
* chore: Add in some logging for the new system
* bring in start-sdk
* remove avahi
* chore: Update the deps
* switch to musl
* chore: Update the version of prettier
* chore: Organize'
* chore: Update some of the headers back to the standard of fetch
* fix musl build
* fix idmapped mounts
* fix cross build
* use cross compiler for correct arch
* feat: Add in the faked ssl stuff for the effects
* @dr_bonez Did a solution here
* chore: Something that DrBonez
* chore: up
* wip: We have a working server!!!
* wip
* uninstall
* wip
* tes
* misc fixes
* fix cli
* replace interface with host
* chore: Fix the types in some ts files
* chore: quick update for the system for embassy to update the types
* replace br-start9 with lxcbr0
* split patchdb into public/private
* chore: Add changes for config set
* Feat: Adding some debugging for the errors
* wip: Working on getting the set config to work
* chore: Update and fix the small issue with the deserialization
* lightning, masked, schemeOverride, invert host-iface relationship
* feat: Add in the changes for just the sdk
* feat: Add in the changes for the new effects I suppose for now
---------
Co-authored-by: J H <2364004+Blu-J@users.noreply.github.com>
Co-authored-by: J H <Blu-J@users.noreply.github.com>
Co-authored-by: J H <dragondef@gmail.com>
Co-authored-by: Matt Hill <mattnine@protonmail.com>
* wip: static-server errors
* wip: fix wifi
* wip: Fix the service_effects
* wip: Fix cors in the middleware
* wip(chore): Auth clean up the lint.
* wip(fix): Vhost
* wip: continue manager refactor
Co-authored-by: J H <Blu-J@users.noreply.github.com>
* wip: service manager refactor
* wip: Some fixes
* wip(fix): Fix the lib.rs
* wip
* wip(fix): Logs
* wip: bins
* wip(innspect): Add in the inspect
* wip: config
* wip(fix): Diagnostic
* wip(fix): Dependencies
* wip: context
* wip(fix) Sorta auth
* wip: warnings
* wip(fix): registry/admin
* wip(fix) marketplace
* wip(fix) Some more converted and fixed with the linter and config
* wip: Working on the static server
* wip(fix)static server
* wip: Remove some asynnc
* wip: Something about the request and regular rpc
* wip: gut install
Co-authored-by: J H <Blu-J@users.noreply.github.com>
* wip: Convert the static server into the new system
* wip delete file
* test
* wip(fix) vhost does not need the with safe defaults
* wip: Adding in the wifi
* wip: Fix the developer and the verify
* wip: new install flow
Co-authored-by: J H <Blu-J@users.noreply.github.com>
* fix middleware
* wip
* wip: Fix the auth
* wip
* continue service refactor
* feature: Service get_config
* feat: Action
* wip: Fighting the great fight against the borrow checker
* wip: Remove an error in a file that I just need to deel with later
* chore: Add in some more lifetime stuff to the services
* wip: Install fix on lifetime
* cleanup
* wip: Deal with the borrow later
* more cleanup
* resolve borrowchecker errors
* wip(feat): add in the handler for the socket, for now
* wip(feat): Update the service_effect_handler::action
* chore: Add in the changes to make sure the from_service goes to context
* chore: Change the
* refactor service map
* fix references to service map
* fill out restore
* wip: Before I work on the store stuff
* fix backup module
* handle some warnings
* feat: add in the ui components on the rust side
* feature: Update the procedures
* chore: Update the js side of the main and a few of the others
* chore: Update the rpc listener to match the persistant container
* wip: Working on updating some things to have a better name
* wip(feat): Try and get the rpc to return the correct shape?
* lxc wip
* wip(feat): Try and get the rpc to return the correct shape?
* build for container runtime wip
* remove container-init
* fix build
* fix error
* chore: Update to work I suppose
* lxc wip
* remove docker module and feature
* download alpine squashfs automatically
* overlays effect
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* chore: Add the overlay effect
* feat: Add the mounter in the main
* chore: Convert to use the mounts, still need to work with the sandbox
* install fixes
* fix ssl
* fixes from testing
* implement tmpfile for upload
* wip
* misc fixes
* cleanup
* cleanup
* better progress reporting
* progress for sideload
* return real guid
* add devmode script
* fix lxc rootfs path
* fix percentage bar
* fix progress bar styling
* fix build for unstable
* tweaks
* label progress
* tweaks
* update progress more often
* make symlink in rpc_client
* make socket dir
* fix parent path
* add start-cli to container
* add echo and gitInfo commands
* wip: Add the init + errors
* chore: Add in the exit effect for the system
* chore: Change the type to null for failure to parse
* move sigterm timeout to stopping status
* update order
* chore: Update the return type
* remove dbg
* change the map error
* chore: Update the thing to capture id
* chore add some life changes
* chore: Update the loging
* chore: Update the package to run module
* us From for RpcError
* chore: Update to use import instead
* chore: update
* chore: Use require for the backup
* fix a default
* update the type that is wrong
* chore: Update the type of the manifest
* chore: Update to make null
* only symlink if not exists
* get rid of double result
* better debug info for ErrorCollection
* chore: Update effects
* chore: fix
* mount assets and volumes
* add exec instead of spawn
* fix mounting in image
* fix overlay mounts
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* misc fixes
* feat: Fix two
* fix: systemForEmbassy main
* chore: Fix small part of main loop
* chore: Modify the bundle
* merge
* fixMain loop"
* move tsc to makefile
* chore: Update the return types of the health check
* fix client
* chore: Convert the todo to use tsmatches
* add in the fixes for the seen and create the hack to allow demo
* chore: Update to include the systemForStartOs
* chore UPdate to the latest types from the expected outout
* fixes
* fix typo
* Don't emit if failure on tsc
* wip
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* add s9pk api
* add inspection
* add inspect manifest
* newline after display serializable
* fix squashfs in image name
* edit manifest
Co-authored-by: Jade <Blu-J@users.noreply.github.com>
* wait for response on repl
* ignore sig for now
* ignore sig for now
* re-enable sig verification
* fix
* wip
* env and chroot
* add profiling logs
* set uid & gid in squashfs to 100000
* set uid of sqfs to 100000
* fix mksquashfs args
* add env to compat
* fix
* re-add docker feature flag
* fix docker output format being stupid
* here be dragons
* chore: Add in the cross compiling for something
* fix npm link
* extract logs from container on exit
* chore: Update for testing
* add log capture to drop trait
* chore: add in the modifications that I make
* chore: Update small things for no updates
* chore: Update the types of something
* chore: Make main not complain
* idmapped mounts
* idmapped volumes
* re-enable kiosk
* chore: Add in some logging for the new system
* bring in start-sdk
* remove avahi
* chore: Update the deps
* switch to musl
* chore: Update the version of prettier
* chore: Organize'
* chore: Update some of the headers back to the standard of fetch
* fix musl build
* fix idmapped mounts
* fix cross build
* use cross compiler for correct arch
* feat: Add in the faked ssl stuff for the effects
* @dr_bonez Did a solution here
* chore: Something that DrBonez
* chore: up
* wip: We have a working server!!!
* wip
* uninstall
* wip
* tes
---------
Co-authored-by: J H <dragondef@gmail.com>
Co-authored-by: J H <Blu-J@users.noreply.github.com>
Co-authored-by: J H <2364004+Blu-J@users.noreply.github.com>
* fix sdk build script
* fix: Docker stopping will include a timeoute
So the timeout that was included in the original is not working therefore we move to a doublinig with a timeout
* fix: Adding in the missing suggestions that Aiden has poinited out
* Update install-sdk.sh
* Update install-sdk.sh
---------
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
Co-authored-by: Aiden McClelland <me@drbonez.dev>
* wip
* update marketplace categories styling
* update logo icons
* add sort pipe
* update search component styling
* clean up categories component
* cleanup and remove unnecessary sort pipe
* query packages in selected category
* fix search styling
* add reg icon and font, adjust category styles
* fix build from rebasing integration/refactors
* adjust marketplace types for icon with store data, plus formatting
* formatting
* update categories and search
* hover styling for categories
* category styling
* refactor for category as a behavior subject
* more category styling
* base functionality with new marketplace components
* styling cleanup
* misc style fixes and fix category selection from package page
* fixes from review feedback
* add and style additional details
* implement release notes modal
* fix menu when on service show page mobile to display change marketplace
* style and responsiveness fixes
* rename header to sidebar
* input icon config to sidebar
* add mime type pipe and type fn
* review feedback fixes
* skeleton text, more abstraction
* reorder categories, clean up a little
* audit sidebar, categories, store-icon, marketplace-sidebar, search
* finish code cleanup and fix few bugs
* misc fixes and cleanup
* fix broken styles and markdown
* bump shared marketplace version
* more cleanup
* sync package lock
* rename sidebar component to menu
* wip preview sidebar
* sync package lock
* breakout package show elements into components
* link to brochure in preview; custom taiga button styles
* move marketplace preview component into ui; open preview when viewing service in marketplace
* sync changes post file struture rename
* further cleanup
* create service for sidebar toggle and cleanup marketplace components
* bump shared marketplace version
* bump shared for new images needed for brochure marketplace
* cleanup
---------
Co-authored-by: Matt Hill <mattnine@protonmail.com>
Leaving in the thing about the rpc client because that will be part of the rewrite, and some of the previous logic should be usefull for the next version of the api. We do need a bidirection but that should world
This includes the docker commands to get things compressed.
And this is the start of the rpc, but needs lots of work, or very little, not sure yet anymore.
I beleive that the things that are missing are the rpc, and the effects. So, lots of work, but is still good to have I suppose.
* proxies
* OS outbound proxy. ugly, needs work
* abstract interface address management
* clearnet and outbound proxies for services
* clean up
* router tab
* smart launching of UIs
* update sdk types
* display outbound proxy on service show and rework menu
* feat(portal): implement adding/removing to desktop, reordering desktop items, baseline for system utils
* chore: fix comments
---------
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
update FE types and unify sideload page with marketplace show
begin popover for UI launch select
update node version for github workflows
fix type errors
eager load more components
fix mocks for types
recalculate updates bad on pkg uninstall
chore: break form-object file structure
files for config
finish file upload API and implement for config
chore: break down form-object by type, part 1
remove NEW from config
comment entire setTimeout for new
generic form options
chore: break down form-object by type, part 2
headers for enums and unions
implement select and multiselect for config
update union types and camel case for specs
implement textarea config value
inputspec and required instead of nullable
remove subtype from list spec
update start-sdk
bump start-sdk
feat: use Taiga UI for config modal (#2250)
* feat: use Taiga UI for config modal
* chore: finish remaining changes
* chore: address comments
* bump sdk version
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
update package lock
update to sdk 20 and fix types
chore: update Taiga UI and migrate some more forms (#2252)
update form to latest sdk
validate length for textarea too
chore: accommodate new changes to the specs (#2254)
* chore: accommodate new changes to the specs
* chore: fix error
* chore: fix error
feat: add input color (#2257)
* feat: add input color
* patterns will always be there
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
chore: properly type pattern error
update to latest sdk
Add sans-serif font fallback (#2263)
* Add sans-serif font fallback
* Update frontend readme start scripts
feat: add datetime spec support (#2264)
Wifi optional (#2249)
* begin work
* allow enable and disable wifi
* nice styling
* done except for popover not dismissing
* update wifi.ts
* address comments
Feat/automated backups (#2142)
* initial restructuring
* very cool
* new structure in place
* delete unnecessary T
* down the rabbit hole
* getting better
* dont like it
* nice
* very nice
* sessions select all
* nice
* backup runs
* fix targets and more
* small improvements
* mostly working
* address PR comments
* fix error
* delete issue with merge
* fix checkboxes and add API for deleting backup runs
* better styling for checkboxes
* small button in ssh kpage too
* complete multiple UI launcher
* fix actions
* present error toast too
* fix target forms
Add logs window to setup wizard loading screen (#2076)
* add logs window to setup wizard loading screen
* fix type error
* Update frontend/projects/setup-wizard/src/app/services/api/live-api.service.ts
Co-authored-by: Lucy C <12953208+elvece@users.noreply.github.com>
---------
Co-authored-by: Lucy C <12953208+elvece@users.noreply.github.com>
statically type server metrics and use websocket (#2124)
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
Feat/external-smtp (#1791)
* UI for EOS smtp, missing API layer
* implement api
* fix errors
* switch to external smtp creds
* fix things up
* fix types
* update types for new forms
* feat: add new form to emails and marketplace (#2268)
* import tuilet module
* feat: get rid of old form completely (#2270)
* move to builder spec and delete developer menu
* update sdk
* tiny
* getting better
* working
* done
* feat: add step to number config
* chore: small fixes
* update SDK and step for numbers
---------
Co-authored-by: Alex Inkin <alexander@inkin.ru>
latest sdk, fix build
update SDK for better disabled props
feat: implement `disabled`, `immutable` and `generate` (#2280)
* feat: implement `disabled`, `immutable` and `generate`
* chore: remove unnecessary code
* chore: add generate to textarea and implement immutable
* no generate for textarea
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
update lockfile
refactor: extract loading status to shared library (#2282)
* refactor: extract loading status to shared library
* chore: remove inline style
refactor: break routing down to apps level (#2285)
closes#2212 and closes#2214
Feat/credentials (#2290)
add credentials and remove properties
refactor: break ui up further down (#2292)
* refactor: break ui up further down
* permit loading even when authed
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
update patchdb for package compatability fixes
fix file structure
WIP
finish rebase
mvp complete
port forwards mvp
looking good
cleaner system page
move experimental features
manual port overrides
better info headers for jobs pages
refactor: move diagnostic-ui app under ui route (#2306)
* refactor: move diagnostic-ui app under ui route
* chore: hide navigation
* chore: remove ionic from diagnostic
* fix navbar showing on login
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
chore: partially remove ionic modals and loaders (#2308)
* chore: partially remove ionic modals and loaders
* change to snake
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
better session data fetching
abstract store icon component to shared marketplace project (#2311)
* abstract store icon component to shared marketplace project
* better than using a pipe
* minor cleanup
* chore: fix missing node types in libraries
* typo
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
Co-authored-by: waterplea <alexander@inkin.ru>
refactor: continue to get rid of ionic infrastructure (#2325)
refactor: finish removing ionic entities: (#2333)
* refactor: finish removing ionic entities:
ToastController
ErrorToastService
ModalController
AlertController
LoadingController
* chore: rollback testing code
* chore: fix comments
* minor form change
* chore: fix comments
* update clearnet address parts
* move around patchDB
* chore: fix comments
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
fixup after rebase
* feat: implement `disabled`, `immutable` and `generate`
* chore: remove unnecessary code
* chore: add generate to textarea and implement immutable
* no generate for textarea
---------
Co-authored-by: Matt Hill <matthewonthemoon@gmail.com>
* UI for EOS smtp, missing API layer
* implement api
* fix errors
* switch to external smtp creds
* fix things up
* fix types
* update types for new forms
* feat: add new form to emails and marketplace (#2268)
* import tuilet module
* feat: get rid of old form completely (#2270)
* move to builder spec and delete developer menu
* update sdk
* tiny
* getting better
* working
* done
* feat: add step to number config
* chore: small fixes
* update SDK and step for numbers
---------
Co-authored-by: Alex Inkin <alexander@inkin.ru>
* initial restructuring
* very cool
* new structure in place
* delete unnecessary T
* down the rabbit hole
* getting better
* dont like it
* nice
* very nice
* sessions select all
* nice
* backup runs
* fix targets and more
* small improvements
* mostly working
* address PR comments
* fix error
* delete issue with merge
* fix checkboxes and add API for deleting backup runs
* better styling for checkboxes
* small button in ssh kpage too
* complete multiple UI launcher
* fix actions
* present error toast too
* fix target forms
wip: Refactoring the service
-> Made new skeleton
-> Added service manager
-> Manager Refactored
-> Cleanup
-> Add gid struct
-> remove synchronizer
-> Added backup into manager
-> Fix the configure signal not send
-> Fixes around backup and sync
wip: Moved over the config into the service manager
js effect for subscribing to config
js effect for subscribing to config
fix errors
chore: Fix some things in the manager for clippy
add interfaces from manifest automatically
make OsApi manager-based
wip: Starting down the bind for the effects
todo: complete a ip todo
chore: Fix the result type on something
todo: Address returning
chore: JS with callbacks
chore: Add in the chown and permissions
chore: Add in the binds and unbinds in
feat: Add in the ability to get configs
makefile changes
add start/stop/restart to effects
config hooks
fix: add a default always to the get status
chore: Only do updates when the thing is installed.
use nistp256 to satisfy firefox
use ed25519 if available
chore: Make the thing buildable for testing
chore: Add in the debugging
fix ip signing
chore: Remove the bluj tracing
fix SQL error
chore: Fix the build
update prettytable to fix segfault
Chore: Make these fn's instead of allways ran.
chore: Fix the testing
fix: The stopping/ restarting service
fix: Fix the restarting.
remove current-dependents, derive instead
remove pointers from current-dependencies
remove pointers and system pointers from FE
v0.3.4
remove health checks from manifest
remove "restarting" bool on "starting" status
remove restarting attr
update makefile
fix
add efi support
fix efi
add redirect if connecting to https over http
clean up
lan port forwarding
add `make update` and `make update-overlay`
fix migration
more protections
fix: Fix a lint
chore: remove the limit on the long-running
fix: Starting sometimes.
fix: Make it so the stop of the main works
fix: Bind local and tor with package.
wip: envs
closes#2152, closes#2155, closes#2157
fix TS error
import config types from sdk
update package.json
chore: remove the limit on the long-running
fix: Starting sometimes.
fix: Make it so the stop of the main works
fix: Bind local and tor with package.
wip: envs
fix TS error
import config types from sdk
update package.json
fix: add a default always to the get status
chore: Only do updates when the thing is installed.
chore: Make the thing buildable for testing
chore: Add in the debugging
chore: Remove the bluj tracing
chore: Fix the build
Chore: Make these fn's instead of allways ran.
chore: Fix the testing
fix: The stopping/ restarting service
fix: Fix the restarting.
todo: complete a ip todo
chore: Fix the result type on something
todo: Address returning
chore: JS with callbacks
chore: Add in the chown and permissions
chore: Add in the binds and unbinds in
-> Made new skeleton
-> Added service manager
-> Manager Refactored
-> Cleanup
-> Add gid struct
-> remove synchronizer
-> Added backup into manager
-> Fix the configure signal not send
-> Fixes around backup and sync
wip: Moved over the config into the service manager
2023-07-06 15:07:53 -06:00
2746 changed files with 215962 additions and 96442 deletions
StartOS is an open-source Linux distribution for running personal servers. It manages discovery, installation, network configuration, backups, and health monitoring of self-hosted services.
├── image-recipe/ # Scripts for building StartOS images
├── patch-db/ # (submodule) Diff-based data store for frontend sync
├── sdk/ # TypeScript SDK for building StartOS packages
└── web/ # Web UIs (Angular)
```
## Components
- **`core/`** — Rust backend daemon. Produces a single binary `startbox` that is symlinked as `startd` (main daemon), `start-cli` (CLI), `start-container` (runs inside LXC containers), `registrybox` (package registry), and `tunnelbox` (VPN/tunnel). Handles all backend logic: RPC API, service lifecycle, networking (DNS, ACME, WiFi, Tor, WireGuard), backups, and database state management. See [core/ARCHITECTURE.md](core/ARCHITECTURE.md).
- **`web/`** — Angular 21 + TypeScript workspace using Taiga UI 5. Contains three applications (admin UI, setup wizard, VPN management) and two shared libraries (common components/services, marketplace). Communicates with the backend exclusively via JSON-RPC. See [web/ARCHITECTURE.md](web/ARCHITECTURE.md).
- **`container-runtime/`** — Node.js runtime that runs inside each service's LXC container. Loads the service's JavaScript from its S9PK package and manages subcontainers. Communicates with the host daemon via JSON-RPC over Unix socket. See [container-runtime/CLAUDE.md](container-runtime/CLAUDE.md).
- **`sdk/`** — TypeScript SDK for packaging services for StartOS (`@start9labs/start-sdk`). Split into `base/` (core types, ABI definitions, effects interface, consumed by web as `@start9labs/start-sdk-base`) and `package/` (full SDK for service developers, consumed by container-runtime as `@start9labs/start-sdk`).
- **`patch-db/`** — Git submodule providing diff-based state synchronization. Uses CBOR encoding. Backend mutations produce diffs that are pushed to the frontend via WebSocket, enabling reactive UI updates without polling. See [patch-db repo](https://github.com/Start9Labs/patch-db).
## Build Pipeline
Components have a strict dependency chain. Changes flow in one direction:
```
Rust (core/)
→ cargo test exports ts-rs types to core/bindings/
**Important**: Editing `sdk/base/lib/osBindings/*.ts` alone is NOT sufficient — you must rebuild the SDK bundle (step 3) before web/container-runtime can see the changes.
## Cross-Layer Verification
When making changes across multiple layers (Rust, SDK, web, container-runtime), verify in this order:
- Runs `./core/build/build-ts.sh` to export ts-rs types to `core/bindings/`
- Syncs `core/bindings/` → `sdk/base/lib/osBindings/` via rsync
- If you manually edit files in `sdk/base/lib/osBindings/`, you must still rebuild the SDK (step 3)
3.**SDK bundle**: `cd sdk && make baseDist dist` — compiles SDK source into packages
-`baseDist/` is consumed by `/web` (via `@start9labs/start-sdk-base`)
-`dist/` is consumed by `/container-runtime` (via `@start9labs/start-sdk`)
- Web and container-runtime reference the **built** SDK, not source files
4.**Web type check**: `cd web && npm run check` — type-checks all Angular projects
5.**Container runtime type check**: `cd container-runtime && npm run check` — type-checks the runtime
## Data Flow: Backend to Frontend
StartOS uses Patch-DB for reactive state synchronization:
1. The backend mutates state via `db.mutate()`, producing CBOR diffs
2. Diffs are pushed to the frontend over a persistent WebSocket connection
3. The frontend applies diffs to its local state copy and notifies observers
4. Components watch specific database paths via `PatchDB.watch$()`, receiving updates reactively
This means the UI is always eventually consistent with the backend — after any mutating API call, the frontend waits for the corresponding PatchDB diff before resolving, so the UI reflects the result immediately.
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Architecture
See [ARCHITECTURE.md](ARCHITECTURE.md) for the full system architecture, component map, build pipeline, and cross-layer verification order.
Each major component has its own `CLAUDE.md` with detailed guidance: `core/`, `web/`, `container-runtime/`, `sdk/`.
## Build & Development
See [CONTRIBUTING.md](CONTRIBUTING.md) for:
- Environment setup and requirements
- Build commands and make targets
- Testing and formatting commands
- Environment variables
**Quick reference:**
```bash
. ./devmode.sh # Enable dev mode
make update-startbox REMOTE=start9@<ip> # Fastest iteration (binary + UI)
make test-core # Run Rust tests
```
## Operating Rules
- Always verify cross-layer changes using the order described in [ARCHITECTURE.md](ARCHITECTURE.md#cross-layer-verification)
- Check component-level CLAUDE.md files for component-specific conventions. ALWAYS read it before operating on that component.
- Follow existing patterns before inventing new ones
- Always use `make` recipes when they exist for testing builds rather than manually invoking build commands
- **Commit signing:** Never push unsigned commits. Before pushing, check all unpushed commits for signatures with `git log --show-signature @{upstream}..HEAD`. If any are unsigned, prompt the user to sign them with `git rebase --exec 'git commit --amend -S --no-edit' @{upstream}`.
## Supplementary Documentation
The `docs/` directory contains cross-cutting documentation for AI assistants:
-`TODO.md` - Pending tasks for AI agents (check this first, remove items when completed)
-`USER.md` - Current user identifier (gitignored, see below)
-`exver.md` - Extended versioning format (used across core, sdk, and web)
-`VERSION_BUMP.md` - Guide for bumping the StartOS version across the codebase
Component-specific docs live alongside their code (e.g., `core/rpc-toolkit.md`, `core/i18n-patterns.md`).
### Session Startup
On startup:
1.**Check for `docs/USER.md`** - If it doesn't exist, prompt the user for their name/identifier and create it. This file is gitignored since it varies per developer.
2.**Check `docs/TODO.md` for relevant tasks** - Show TODOs that either:
- Have no `@username` tag (relevant to everyone)
- Are tagged with the current user's identifier
Skip TODOs tagged with a different user.
3.**Ask "What would you like to do today?"** - Offer options for each relevant TODO item, plus "Something else" for other requests.
This guide is for contributing to the StartOS. If you are interested in packaging a service for StartOS, visit the [service packaging guide](https://docs.start9.com/latest/developer-docs/). If you are interested in promoting, providing technical support, creating tutorials, or helping in other ways, please visit the [Start9 website](https://start9.com/contribute).
This guide is for contributing to the StartOS. If you are interested in packaging a service for StartOS, visit the [service packaging guide](https://github.com/Start9Labs/ai-service-packaging). If you are interested in promoting, providing technical support, creating tutorials, or helping in other ways, please visit the [Start9 website](https://start9.com/contribute).
This sets `ENVIRONMENT=dev` and `GIT_BRANCH_AS_HASH=1` to prevent rebuilds on every commit.
## Building
This project uses [GNU Make](https://www.gnu.org/software/make/) to build its components. To build any specific component, simply run `make <TARGET>` replacing `<TARGET>` with the name of the target you'd like to build
All builds can be performed on any operating system that can run Docker.
This project uses [GNU Make](https://www.gnu.org/software/make/) to build its components.
-`PLATFORM`: which platform you would like to build for. Must be one of `x86_64`, `x86_64-nonfree`, `aarch64`, `aarch64-nonfree`, `raspberrypi`
- NOTE: `nonfree` images are for including `nonfree` firmware packages in the built ISO
-`ENVIRONMENT`: a hyphen separated set of feature flags to enable
-`dev`: enables password ssh (INSECURE!) and does not compress frontends
-`unstable`: enables assertions that will cause errors on unexpected inconsistencies that are undesirable in production use either for performance or reliability reasons
-`docker`: use `docker` instead of `podman`
-`GIT_BRANCH_AS_HASH`: set to `1` to use the current git branch name as the git hash so that the project does not need to be rebuilt on each commit
### Environment Variables
### Useful Make Targets
-`iso`: Create a full `.iso` image
- Only possible from Debian
- Not available for `PLATFORM=raspberrypi`
- Additional Requirements:
- [debspawn](https://github.com/lkhq/debspawn)
-`img`: Create a full `.img` image
- Only possible from Debian
- Only available for `PLATFORM=raspberrypi`
- Additional Requirements:
- [debspawn](https://github.com/lkhq/debspawn)
-`format`: Run automatic code formatting for the project
- Additional Requirements:
- [rust](https://rustup.rs/)
-`test`: Run automated tests for the project
- Additional Requirements:
- [rust](https://rustup.rs/)
-`update`: Deploy the current working project to a device over ssh as if through an over-the-air update
- Requires an argument `REMOTE` which is the ssh address of the device, i.e. `start9@192.168.122.2`
-`reflash`: Deploy the current working project to a device over ssh as if using a live `iso` image to reflash it
- Requires an argument `REMOTE` which is the ssh address of the device, i.e. `start9@192.168.122.2`
-`update-overlay`: Deploy the current working project to a device over ssh to the in-memory overlay without restarting it
- WARNING: changes will be reverted after the device is rebooted
- WARNING: changes to `init` will not take effect as the device is already initialized
- Requires an argument `REMOTE` which is the ssh address of the device, i.e. `start9@192.168.122.2`
-`wormhole`: Deploy the `startbox` to a device using [magic-wormhole](https://github.com/magic-wormhole/magic-wormhole)
- When the build it complete will emit a command to paste into the shell of the device to upgrade it
ls core/bindings/*.ts | sed 's/core\/bindings\/\([^.]*\)\.ts/export { \1 } from ".\/\1";/g'| grep -v '"./index"'| tee core/bindings/index.ts
if[ -d core/bindings/tunnel ];then\
ls core/bindings/tunnel/*.ts | sed 's/core\/bindings\/tunnel\/\([^.]*\)\.ts/export { \1 } from ".\/\1";/g'| grep -v '"./index"' > core/bindings/tunnel/index.ts;\
echo'export * as Tunnel from "./tunnel";' >> core/bindings/index.ts;\
StartOS is an open source Linux distribution optimized for running a personal server. It facilitates the discovery, installation, network configuration, service configuration, data backup, dependency management, and health monitoring of self-hosted software services.
There are multiple ways to get started with StartOS:
## What is StartOS?
### 💰 Buy a Start9 server
This is the most convenient option. Simply [buy a server](https://store.start9.com) from Start9 and plug it in.
StartOS is an open-source Linux distribution for running a personal server. It handles discovery, installation, network configuration, data backup, dependency management, and health monitoring of self-hosted services.
### 👷 Build your own server
This option is easier than you might imagine, and there are 4 reasons why you might prefer it:
1. You already have hardware
1. You want to save on shipping costs
1. You prefer not to divulge your physical address
1. You just like building things
**Tech stack:** Rust backend (Tokio/Axum), Angular frontend, Node.js container runtime with LXC, and a custom diff-based database ([Patch-DB](https://github.com/Start9Labs/patch-db)) for reactive state synchronization.
To pursue this option, follow one of our [DIY guides](https://start9.com/latest/diy).
Services run in isolated LXC containers, packaged as [S9PKs](https://github.com/Start9Labs/start-os/blob/master/core/s9pk-structure.md) — a signed, merkle-archived format that supports partial downloads and cryptographic verification.
## ❤️ Contributing
There are multiple ways to contribute: work directly on StartOS, package a service for the marketplace, or help with documentation and guides. To learn more about contributing, see [here](https://start9.com/contribute/).
## What can you do with it?
To report security issues, please email our security team - security@start9.com.
StartOS lets you self-host services that would otherwise depend on third-party cloud providers — giving you full ownership of your data and infrastructure.
## 🌎 Marketplace
There are dozens of services available for StartOS, and new ones are being added all the time. Check out the full list of available services [here](https://marketplace.start9.com/marketplace). To read more about the Marketplace ecosystem, check out this [blog post](https://blog.start9.com/start9-marketplace-strategy/)
Browse available services on the [Start9 Marketplace](https://marketplace.start9.com/), including:
## 🖥️ User Interface Screenshots
- **Bitcoin & Lightning** — Run a full Bitcoin node, Lightning node, BTCPay Server, and other payment infrastructure
- **Communication** — Self-host Matrix, SimpleX, or other messaging platforms
- **Cloud Storage** — Run Nextcloud, Vaultwarden, and other productivity tools
<img src="assets/nextcloud.png" alt="StartOS System Settings" width="49%">
<img src="assets/system.png" alt="StartOS System Settings" width="49%">
<img src="assets/welcome.png" alt="StartOS System Settings" width="49%">
<img src="assets/logs.png" alt="StartOS System Settings" width="49%">
</p>
Services are added by the community. If a service you want isn't available, you can [package it yourself](https://github.com/Start9Labs/ai-service-packaging/).
## Getting StartOS
### Buy a Start9 server
The easiest path. [Buy a server](https://store.start9.com) from Start9 and plug it in.
### Build your own
Follow the [install guide](https://docs.start9.com/start-os/installing.html) to install StartOS on your own hardware. . Reasons to go this route:
1. You already have compatible hardware
2. You want to save on shipping costs
3. You prefer not to share your physical address
4. You enjoy building things
### Build from source
See [CONTRIBUTING.md](CONTRIBUTING.md) for environment setup, build instructions, and development workflow.
## Contributing
There are multiple ways to contribute: work directly on StartOS, package a service for the marketplace, or help with documentation and guides. See [CONTRIBUTING.md](CONTRIBUTING.md) or visit [start9.com/contribute](https://start9.com/contribute/).
To report security issues, email [security@start9.com](mailto:security@start9.com).
for file in $(find web/dist/raw -type f -not -name '*.gz' -and -not -name '*.br');do
raw_size=$(du $file| awk '{print $1 * 512}')
gz_size=$(du $file.gz | awk '{print $1 * 512}')
br_size=$(du $file.br | awk '{print $1 * 512}')
if[$((gz_size *100/ raw_size)) -gt 70];then
rm $file.gz
fi
if[$((br_size *100/ raw_size)) -gt 70];then
rm $file.br
fi
done
fi
cp -r web/dist/raw web/dist/static
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.