Releases: Cod-e-Codes/marchat
Release list
v0.4.0-beta.3
v0.4.0-beta.3
Released: 27 Aug 2025
Commit: 2c93867
Major Changes:
-
FIX: Correct Recent Message Retrieval Order:
- Updated
GetRecentMessagesand related functions to fetch the newest 50 messages instead of the oldest - Changed SQL queries from
ORDER BY created_at ASC→ORDER BY created_at DESC - Ensures recent message history displays correctly in chronological order
- Combined with existing Go-side sorting to maintain consistent chat ordering
- Updated
Technical Improvements:
-
Database Query Enhancements:
- All recent message fetching functions (
GetRecentMessages,GetRecentMessagesForUser,GetMessagesAfter) now correctly handle limits and ordering - Preserves fallback behavior for new users and partial history
- Maintains compatibility with existing user last-seen tracking
- All recent message fetching functions (
-
Release Workflow:
- Builds Linux, Windows, Darwin, and Android ARM64 targets
- Docker builds continue to receive dynamic
VERSION,BUILD_TIME, andGIT_COMMITargs - Optional
--debugflag remains for troubleshooting Docker builds
Usage Notes:
- Users now see the most recent messages first in chat history
- Legacy
sortMessagesByTimestamplogic preserved for display consistency - Docker images updated to reflect new release version
Docker Notes:
Image: codecodesxyz/marchat:v0.4.0-beta.3
Also tagged as latest for convenience.
Fully compatible with previous volumes; no migrations required.
Assets:
- marchat-v0.4.0-beta.3-linux-amd64.zip
- marchat-v0.4.0-beta.3-darwin-amd64.zip
- marchat-v0.4.0-beta.3-windows-amd64.zip
- marchat-v0.4.0-beta.3-android-arm64.zip
Full Changelog: v0.4.0-beta.2...v0.4.0-beta.3
Verification Checklist:
- Confirm recent message retrieval now returns newest messages first
- Test combined history and last-seen message logic for returning users
- Build and push Docker images using updated release process
- Verify
marchat-server --versionandmarchat-client --versionshow correct version, commit, and build time - Run server and client builds for all platforms to confirm successful build completion
v0.4.0-beta.2
v0.4.0-beta.2
Released: 26 Aug 2025
Commit: c4826ef
Major Changes:
-
GLOBAL ENCRYPTION VARIABLE SUPPORT: Centralized configuration for encryption behavior
- Introduced a single global encryption toggle accessible throughout the codebase
- Eliminates redundant encryption state checks in individual modules
- Ensures consistent encryption status across server and client components
- Simplifies code maintenance and reduces risk of inconsistent encryption handling
-
DOCKER BUILD INTEGRATION IN RELEASE PROCESS:
- Release process now includes building and pushing Docker images alongside binaries
- Docker builds receive dynamic
VERSION,BUILD_TIME, andGIT_COMMITargs - Tags each image with both the release version and
latest - Ensures Docker Hub images display correct version metadata
Technical Improvements:
-
Release Workflow:
- Builds Linux, Windows, Darwin, and Android ARM64 targets
- Automates Docker build and push at release time
- Reuses same version variables for both Go binaries and Docker images
- Optional
--debugflag available for troubleshooting Docker builds
-
Encryption Handling:
- Added centralized global variable for encryption state
- Updated client and server init logic to read from global state
- Reduced duplicate encryption flag passing between modules
Usage Notes:
- Enable/disable encryption via the global variable in configuration
- Docker images are now versioned dynamically and pushed at release time
- All server and client builds now embed build time and commit hash
Docker Notes:
Image: codecodesxyz/marchat:v0.4.0-beta.2
Also tagged as latest for convenience.
Fully compatible with previous volumes; no migrations required.
Assets:
- marchat-v0.4.0-beta.2-linux-amd64.zip
- marchat-v0.4.0-beta.2-darwin-amd64.zip
- marchat-v0.4.0-beta.2-windows-amd64.zip
- marchat-v0.4.0-beta.2-android-arm64.zip
Full Changelog: v0.4.0-beta.1...v0.4.0-beta.2
Verification Checklist:
- Test encryption toggle globally affects all modules
- Build and push Docker images using updated release process
- Verify
marchat-server --versionandmarchat-client --versionshow correct version, commit, and build time - Confirm Docker Hub image metadata matches release version
- Run server and client builds for all platforms to confirm successful build completion
v0.4.0-beta.1
v0.4.0-beta.1
Released: 21 Aug 2025
Commit: ff52fb7
Major Changes:
-
PLATFORM-AWARE PLUGIN REGISTRY: Support for multi-platform plugin distributions
- Registry now supports
goos/goarchfields for platform-specific builds - Automatic platform selection:
:plugin install echopicks the matching variant - CLI overrides:
:install echo --os linux --arch amd64for specific platforms - Store UI shows platform badges
[windows/amd64]in plugin descriptions - Clear error messages when incompatible binaries are detected
- Backward compatible with single-platform registries
- Registry now supports
-
Plugin System Enhancements:
ResolvePlugin()selects best matching variant by name + platformGetPluginsPreferredForPlatform()deduplicates by name, prefers current platform- Enhanced exec-format error detection with helpful override instructions
- Store filtering and display improvements for multi-variant plugins
Technical Improvements:
-
Plugin Store (
plugin/store/store.go):- Added
GoOS,GoArch,MinVersionfields toStorePluginstruct - Platform-aware plugin resolution with fallback logic
- Store UI defaults to preferred platform variants
- Enhanced filtering and deduplication for multi-platform registries
- Added
-
Plugin Manager (
plugin/manager/manager.go):InstallPluginWithPlatform()for explicit platform selectionInstallPlugin()delegates to platform-aware installation- Improved error handling and user guidance
-
Server Commands (
server/plugin_commands.go)::installnow accepts optional--osand--archflags- Updated usage:
:install <plugin-name> [--os <goos>] [--arch <goarch>] - Flag parsing for platform override support
-
Plugin Host (
plugin/host/host.go):- Enhanced exec-format error detection
- Clear error messages with platform mismatch hints
- Suggests correct
--os/--archflags for resolution
Usage Notes:
:plugin install echoautomatically selects the matching platform build- Use
:install echo --os linux --arch amd64to override platform selection - Store UI shows
[platform/arch]badges for easy identification - Incompatible binaries show helpful error messages with resolution steps
Registry Compatibility:
- Supports both old single-platform and new multi-platform registry formats
- New registry format includes
goos,goarch,min_versionfields - Backward compatible with existing plugin registries
Docker Notes:
Image: codecodesxyz/marchat:v0.4.0-beta.1
Fully compatible with previous volumes; no migrations required.
Assets:
- marchat-v0.4.0-beta.1-linux-amd64.zip
- marchat-v0.4.0-beta.1-darwin-amd64.zip
- marchat-v0.4.0-beta.1-windows-amd64.zip
- marchat-v0.4.0-beta.1-android-arm64.zip
Full Changelog: v0.3.0-beta.6...v0.4.0-beta.1
Verification Checklist:
- Test
:plugin install echowith new multi-platform registry - Verify platform badges display correctly in store UI
- Test
:install echo --os linux --arch amd64override functionality - Confirm exec-format errors show helpful resolution messages
- Verify backward compatibility with single-platform registries
- Test platform selection logic with various registry configurations
v0.3.0-beta.6
v0.3.0-beta.6
Released: 15 Aug 2025
Commit: c963150
Major Changes:
-
E2E ENCRYPTION: Fix for session key initialization and startup validation
- Fixed "conversation: test" issue that blocked E2E startup
validateEncryptionRoundtrip()now properly creates and stores session key before attempting encryption- Non-blocking validation: client continues startup even if test encryption fails
- Clear warning messages on validation failures
- Session keys properly derived and stored for global conversation
- Basic E2E and non-E2E client coexistence
-
Client Commands:
:showkeydisplays your public key ID:addkey <username> <pubkey>stores new public keys for encrypted conversations
Technical Improvements:
-
Client (
client/main.go):- Fixed session key creation for validation to prevent startup errors
- Graceful fallback for encryption validation without crashing
- Maintains proper nonce + ciphertext combination handling
- Improved logging and error messages for decryption failures
-
Crypto (
crypto/keystore.go):- Session key derivation now ensures keys exist for validation
- Proper storage of session keys in
KeyStore.sessionKeysandkeystore.dat
Usage Notes:
- Launch client with
--e2eto enable end-to-end encryption - Use
:addkeyto add other users' public keys before sending encrypted messages :showkeydisplays your public key for sharing- Validation failures no longer block client startup
Docker Notes:
Image: codecodesxyz/marchat:v0.3.0-beta.6
Fully compatible with previous volumes; no migrations required.
Assets:
- marchat-v0.3.0-beta.6-linux-amd64.zip
- marchat-v0.3.0-beta.6-darwin-amd64.zip
- marchat-v0.3.0-beta.6-windows-amd64.zip
- marchat-v0.3.0-beta.6-android-arm64.zip
Full Changelog: v0.3.0-beta.5...v0.3.0-beta.6
Verification Checklist:
- Connect client with
--e2eand verify correct encryption/decryption - Test global conversation for proper session key derivation
- Verify
:addkeyand:showkeywork as intended - Confirm fallback behavior works when encryption validation fails
- Confirm server handles
Encryptedflag correctly without breaking DB storage
v0.3.0-beta.5
v0.3.0-beta.5
Released: 15 Aug 2025
Commit: 359f927
Major Changes:
-
E2E ENCRYPTION: Complete overhaul and stabilization
- Outgoing messages are now properly encrypted and sent as
Messagestructs withEncrypted: true - Incoming messages correctly detect and decrypt using the
Encryptedflag - Nonce is now combined with ciphertext and base64-encoded for safe JSON transport
- Clear, informative error messages on decryption failure instead of blank messages
- Session keys scoped per conversation and derived for each participant
- Mixed mode fully supported: E2E and non-E2E clients can coexist
- Outgoing messages are now properly encrypted and sent as
-
Client Commands:
:listkeyscommand lists all stored public keys with truncated Key IDs:addkey <username> <pubkey>stores a new user’s public key for encrypted conversations
-
Fallbacks:
- If encryption fails, messages are sent in plaintext with a warning in the log and banner
Technical Improvements:
-
Client (
client/main.go):- Fixed sending of encrypted messages to match server expectations
- Properly stores and uses nonce + ciphertext combination
- Graceful fallback to plaintext on encryption errors
- Improved logging for decryption failures
- Removed unused
isBinaryDatafunction
-
Server (
cmd/server/main.go):- InsertMessage, GetRecentMessages, and GetMessagesAfter now fully support
Encryptedflag - Existing
is_encryptedfield in database leveraged; no schema changes needed
- InsertMessage, GetRecentMessages, and GetMessagesAfter now fully support
-
Crypto (
crypto/keystore.go):- Enhanced session key derivation and management for global and direct conversations
- Fixed self-session key derivation to ensure send/receive works for sender in global chats
Usage Notes:
- Launch client with
--e2eto enable end-to-end encryption - Use
:addkeyto add other users’ public keys before sending encrypted messages :listkeyshelps verify which public keys are stored locally- Fallback behavior ensures messages still go through even if E2E encryption fails
Docker Notes:
Image: codecodesxyz/marchat:v0.3.0-beta.5
Fully compatible with previous volumes; no migrations required.
Assets:
- marchat-v0.3.0-beta.5-linux-amd64.zip
- marchat-v0.3.0-beta.5-darwin-amd64.zip
- marchat-v0.3.0-beta.5-windows-amd64.zip
- marchat-v0.3.0-beta.5-android-arm64.zip
Full Changelog: v0.3.0-beta.4...v0.3.0-beta.5
Verification Checklist:
- Connect client with
--e2eand verify correct encryption/decryption with multiple users - Test global and direct conversations for proper session key derivation
- Verify
:addkeyand:listkeyswork as intended - Confirm fallback behavior works when encryption fails
- Confirm server handles
Encryptedflag correctly without breaking DB storage
v0.3.0-beta.4
v0.3.0-beta.4
Released: 15 Aug 2025
Commit: fdf3010
Major Changes:
- PLUGINS: Fixed registry integration and enabled remote plugin loading
plugin/registry/registry.jsonupdated to use GitHub release URLs instead of local paths- Added new env var
MARCHAT_PLUGIN_REGISTRY_URL(default: https://raw.githubusercontent.com/Cod-e-Codes/marchat-plugins/main/registry.json) - Server config updated to respect registry URL setting
- TLS: Added client-side verification bypass for development and self-signed certs
- New flag:
--skip-tls-verifyto allow insecure connections during testing - Example:
./marchat-client --skip-tls-verify --server wss://localhost:8080/ws
- New flag:
- E2E ENCRYPTION: Fully integrated into message flow
--e2eflag now encrypts outgoing messages and automatically decrypts incoming ones- Session keys are scoped per conversation for isolation
- Graceful error handling when decryption fails
- CONFIG: Environment variable fixes and enhancements
- Corrected env var name from
MARCHAT_BAN_GAPS_HISTORY→MARCHAT_BAN_HISTORY_GAPS - Default ban history gaps behavior set to
true - Added
PluginRegistryURLto server config with env var support - Help text updated with new configuration options
- Corrected env var name from
Technical Improvements:
- Server (
cmd/server/main.go):- Removed hardcoded registry path in favor of config/env var
- Extended CLI help to show new options
- Client (
client/main.go):- Added
--skip-tls-verifyflag support - Integrated E2E encryption directly into send/receive pipeline
- Configured TLS options on WebSocket dialer
- Improved error logging for failed decryption attempts
- Added
- Config (
config/config.go):- Added
PluginRegistryURLfield and env var support - Fixed ban history gaps env var handling
- Added
- Plugin Registry:
- Updated Echo plugin with correct GitHub release URLs
- Fixed
repositoryandhomepagemetadata
Usage Notes:
- Plugins: Registry now works directly from GitHub by default; override with
MARCHAT_PLUGIN_REGISTRY_URLif needed. - TLS: Use
--skip-tls-verifyonly for testing. Production servers should use valid TLS certs. - E2E Encryption: Launch client with
--e2eto secure conversations; fallbacks prevent total breakage on failures.
Docker Notes:
Image: codecodesxyz/marchat:v0.3.0-beta.4 (or :latest).
Compatible with previous volumes. No manual migration required.
Assets:
- marchat-v0.3.0-beta.4-linux-amd64.zip
- marchat-v0.3.0-beta.4-darwin-amd64.zip
- marchat-v0.3.0-beta.4-windows-amd64.zip
- marchat-v0.3.0-beta.4-android-arm64.zip
Full Changelog: v0.3.0-beta.3...v0.3.0-beta.4
Verification Checklist:
- Set
MARCHAT_PLUGIN_REGISTRY_URL(or use default GitHub registry) - Launch server; confirm plugins load via remote registry
- Connect client with
--skip-tls-verifyagainst a self-signed TLS server - Send/receive encrypted messages with
--e2eenabled; verify correct decryption - Restart server with
MARCHAT_BAN_HISTORY_GAPS=trueand confirm ban history filtering still works
v0.3.0-beta.3
v0.3.0-beta.3
Released: 14 Aug 2025
Commit: d925205
Major Changes:
- FEATURE: Ban History Gaps — banned users can no longer see messages sent during their ban periods after being unbanned
- Added
ban_historytable and server-side filtering inGetRecentMessagesForUser - Hub now records
ban/unbanevents to compute per-user visibility gaps ServeWsupdated to pass config and enforce filtering at session start
- Added
- CONFIG: New env var
MARCHAT_BAN_HISTORY_GAPS(default:true) to enable/disable ban-gap filtering without rebuilding
Database Migration:
- Automatic, non-breaking: server will create the
ban_historytable if it does not exist. No manual migration steps required. Existing data remains intact.
Technical Improvements:
- Handlers: added helpers to record ban/unban events and query ban intervals
- Deterministic history fetch:
GetRecentMessagesForUsernow accepts config and excludes messages within ban windows - README updated: new section documenting Ban History Gaps, environment variable, admin flow, and troubleshooting tips
Admin Notes:
- Behavior when enabled:
- During a ban: user cannot connect or send/receive live messages
- After unban: user’s history view omits messages from the ban interval(s)
- To hide all prior history before unbanning, admins may still optionally back up and run
:cleardb(unchanged)
Docker Notes:
Image: codecodesxyz/marchat:v0.3.0-beta.3 (or :latest).
No manual migration needed; volume mounts still recommended for persistence.
Assets:
- marchat-v0.3.0-beta.3-linux-amd64.zip
- marchat-v0.3.0-beta.3-darwin-amd64.zip
- marchat-v0.3.0-beta.3-windows-amd64.zip
- marchat-v0.3.0-beta.3-android-arm64.zip
Full Changelog: v0.3.0-beta.2...v0.3.0-beta.3
Verification Checklist:
- Set
MARCHAT_BAN_HISTORY_GAPS=true(default) and restart server - Ban a test user, have others send messages, then unban the user
- Confirm: unbanned user’s history excludes messages sent during the ban; new messages appear in correct order
v0.3.0-beta.2
v0.3.0-beta.2
Released: 14 Aug 2025
Commit: 4ab352b
Major Changes:
- BUGFIX: Fixed messages displaying out-of-order for clients after ban/unban cycles
- Ensured consistent message ordering across server and client
- Added sorting in
GetRecentMessagesandGetMessagesAfteron the server - Updated client
renderMessagesandUpdateto sort messages by timestamp on receive and render - Verified correct chronological message display across sessions without restarting the server
Database Migration:
No migration required; existing databases remain compatible.
Technical Improvements:
- Server-side: deterministic message ordering to prevent out-of-order display
- Client-side: added defensive sorting for received and rendered messages
- Backward compatible: fixes only affect message ordering, no other functionality changed
Docker Notes:
Image: codecodesxyz/marchat:v0.3.0-beta.2 (or :latest).
No database migration needed; volume mounts still recommended for persistence.
Assets:
- marchat-v0.3.0-beta.2-linux-amd64.zip
- marchat-v0.3.0-beta.2-darwin-amd64.zip
- marchat-v0.3.0-beta.2-windows-amd64.zip
- marchat-v0.3.0-beta.2-android-arm64.zip
Full Changelog: v0.3.0-beta.1...v0.3.0-beta.2
Test message ordering after ban/unban cycles; verify chronological display on reconnect and client restart.
v0.3.0-beta.1
v0.3.0-beta.1
Released: 13 Aug 2025
Commit: b9407f6
Major Changes:
- BREAKING: Fixed critical "frozen message history" bug where banned/unbanned users could only see messages from before their ban
- Added per-user message state tracking with automatic database migration (new
user_message_statetable andmessage_idcolumn) - Enhanced ban/unban system: users now get complete message history after being unbanned instead of frozen history at ban point
- Improved user experience: personalized message delivery ensures returning users see messages since last connection
- Database schema v2: Automatic migration on first startup with performance indexes for efficient queries
Database Migration:
Existing databases auto-migrate on first startup. Backup recommended before upgrading:
cp ./config/marchat.db ./config/marchat.db.backupMigration typically completes in <30 seconds. Downgrade requires database restore.
Technical Improvements:
- New functions:
GetRecentMessagesForUser(),GetMessagesAfter(),clearUserMessageState() - Enhanced Hub struct with database integration for improved ban/unban state management
- Backward compatible: existing functionality unchanged for normal users
- Performance optimized: database indexes ensure efficient per-user message queries
Docker Notes:
Image: codecodesxyz/marchat:v0.3.0-beta.1 (or :latest).
Database migration runs automatically on container startup. Use volume mounts for persistence during development. For issues with migration in containers, ensure proper database file permissions.
Assets:
- marchat-v0.3.0-beta.1-linux-amd64.zip
- marchat-v0.3.0-beta.1-darwin-amd64.zip
- marchat-v0.3.0-beta.1-windows-amd64.zip
- marchat-v0.3.0-beta.1-android-arm64.zip
What's Changed
- chore(deps): bump golang.org/x/crypto from 0.40.0 to 0.41.0 by @dependabot[bot] in #27
Full Changelog: v0.2.0-beta.5...v0.3.0-beta.1
Test ban/unban functionality with message history; backup database before upgrading; report migration issues with logs.
v0.2.0-beta.5
v0.2.0-beta.5
Released: 08 Aug 2025
Commit: c629cd6
Changes:
- Added env vars: MARCHAT_CONFIG_DIR (config path) and MARCHAT_DB_PATH (DB file). Priority: env > CLI flag > default.
- Docker: Updated compose example for volumes, TLS, health checks; added non-root user with UID/GID args; auto-creates DB dir with permissions.
- Config: Supports XDG on Linux; improved path resolution and error messages.
- Backward compatible with --config-dir flag.
Docker Notes:
Image: codecodesxyz/marchat:v0.2.0-beta.5 (or :latest).
For Unraid/Docker issues (e.g., OOM/permissions): Ensure write access to DB dir; container auto-handles ownership. Report persistent problems in Issues.
Assets:
- marchat-v0.2.0-beta.5-linux-amd64.zip
- marchat-v0.2.0-beta.5-darwin-amd64.zip
- marchat-v0.2.0-beta.5-windows-amd64.zip
- marchat-v0.2.0-beta.5-android-arm64.zip
Changelog: v0.2.0-beta.4...v0.2.0-beta.5
Test Docker setups and env vars; file issues with repro steps.