MemoDocumentation
EN

Build and Packaging

How to build Memo from source and create distributable packages.

Backend Build

CGO_ENABLED=1 go build -o memo .

The output is a single binary named memo (or memo.exe on Windows). This binary contains the Go backend server only — the Flutter frontend is a separate build step.

Frontend Build

cd frontend
flutter build linux --release      # Linux desktop
flutter build windows --release    # Windows desktop
flutter build macos --release      # macOS desktop
flutter build apk --release        # Android companion app
flutter build ios --release        # iOS companion app

Combined Distributions

The desktop app is distributed as a single package containing both the Go backend and the Flutter frontend. The release build script handles combining them.

Linux Packaging

package_linux.sh

The Linux release is packaged via package_linux.sh:

./package_linux.sh

This produces a .tar.gz archive containing:

  • memo (backend binary)
  • memo_frontend/ (Flutter Linux build output)
  • vec0.so (sqlite-vec extension)
  • config/config.yaml (default config)

AppImage (Planned)

An AppImage format is planned for future releases to provide a single-click Linux distribution that bundles all dependencies.

Windows Packaging

Windows releases are built via GitHub Actions CI and produce a .zip archive:

  • memo.exe (backend binary)
  • memo_frontend/ (Flutter Windows build output)
  • vec0.dll (sqlite-vec extension)

An NSIS-based .exe installer is the primary Windows distribution format:

Memo-Setup-v3.1.0.exe

Distribution Formats

Format Platform Status
.exe installer Windows Shipped
.tar.gz portable Linux Shipped
.AppImage Linux Planned
.deb Linux Planned
.dmg macOS Shipped
.apk Android Shipped (companion app)
.ipa iOS Planned (companion app)

Release Script

./build_releases.sh

This script orchestrates full platform builds and produces all distribution archives. The script handles:

  1. Cleaning previous build artifacts
  2. Building the Go backend with CGO enabled
  3. Building Flutter for each target platform
  4. Copying sqlite-vec extension binaries
  5. Packaging into platform-specific archives
  6. (Optional) Code-signing for macOS

Version Bumping

Update the version string in main.go and in the frontend's pubspec.yaml before building a release.