diff --git a/.github/workflows/release-packages.yml b/.github/workflows/release-packages.yml
index c828724..4d1df8d 100644
--- a/.github/workflows/release-packages.yml
+++ b/.github/workflows/release-packages.yml
@@ -59,6 +59,13 @@ jobs:
release-deb:
needs: build-binary
+ strategy:
+ matrix:
+ include:
+ - platform-arch: linux-x64
+ deb-arch: amd64
+ - platform-arch: linux-arm64
+ deb-arch: arm64
runs-on: ubuntu-latest
permissions:
contents: write
@@ -69,16 +76,16 @@ jobs:
id: version
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
- - name: Download linux-x64 binary
+ - name: Download binary
uses: robinraju/release-downloader@v1
with:
tag: ${{ github.ref_name }}
- fileName: amesh-${{ steps.version.outputs.VERSION }}-linux-x64.tar.gz
+ fileName: amesh-${{ steps.version.outputs.VERSION }}-${{ matrix.platform-arch }}.tar.gz
- name: Extract binary
run: |
mkdir -p packaging/dist
- tar -xzf amesh-${{ steps.version.outputs.VERSION }}-linux-x64.tar.gz -C packaging/dist/
+ tar -xzf amesh-${{ steps.version.outputs.VERSION }}-${{ matrix.platform-arch }}.tar.gz -C packaging/dist/
- name: Install nfpm
run: |
@@ -89,14 +96,16 @@ jobs:
- name: Build .deb
working-directory: packaging
run: |
- VERSION=${{ steps.version.outputs.VERSION }} nfpm pkg \
+ VERSION=${{ steps.version.outputs.VERSION }} \
+ DEB_ARCH=${{ matrix.deb-arch }} \
+ nfpm pkg \
--packager deb \
- --target ../amesh_${{ steps.version.outputs.VERSION }}_amd64.deb
+ --target ../amesh_${{ steps.version.outputs.VERSION }}_${{ matrix.deb-arch }}.deb
- name: Upload .deb to GitHub Release
uses: softprops/action-gh-release@v2
with:
- files: amesh_${{ steps.version.outputs.VERSION }}_amd64.deb
+ files: amesh_${{ steps.version.outputs.VERSION }}_${{ matrix.deb-arch }}.deb
update-homebrew:
needs: build-binary
diff --git a/firebase.json b/firebase.json
index 89f117c..1eb8b4d 100644
--- a/firebase.json
+++ b/firebase.json
@@ -12,6 +12,15 @@
"value": "public, max-age=31536000, immutable"
}
]
+ },
+ {
+ "source": "/install",
+ "headers": [
+ {
+ "key": "Content-Type",
+ "value": "text/plain; charset=utf-8"
+ }
+ ]
}
]
}
diff --git a/landpage/src/routes/+page.svelte b/landpage/src/routes/+page.svelte
index f26c4fd..866a0c3 100644
--- a/landpage/src/routes/+page.svelte
+++ b/landpage/src/routes/+page.svelte
@@ -6,8 +6,8 @@
// Install tabs
const installTabs = [
{ label: 'Homebrew', cmd: 'brew install ameshdev/tap/amesh' },
+ { label: 'Shell', cmd: 'curl -fsSL https://authmesh.dev/install | sh' },
{ label: 'npm', cmd: 'npm install @authmesh/sdk' },
- { label: 'Binary', cmd: 'curl -sLO https://github.com/ameshdev/amesh/releases/latest/download/amesh-darwin-arm64.tar.gz' },
];
let activeInstallTab = $state(0);
let installCopied = $state(false);
diff --git a/landpage/src/routes/docs/quickstart/+page.svelte b/landpage/src/routes/docs/quickstart/+page.svelte
index bdf6d02..7e4a076 100644
--- a/landpage/src/routes/docs/quickstart/+page.svelte
+++ b/landpage/src/routes/docs/quickstart/+page.svelte
@@ -64,6 +64,10 @@ brew install ameshdev/tap/amesh
# SDK (in your project)
bun add @authmesh/sdk`} />
+
+
+ # Installs amesh + amesh-agent — no runtime needed
+curl -fsSL https://authmesh.dev/install | sh`} />
# CLI (global)
diff --git a/landpage/src/routes/docs/remote-shell/+page.svelte b/landpage/src/routes/docs/remote-shell/+page.svelte
index 9d31c6b..1c3ac36 100644
--- a/landpage/src/routes/docs/remote-shell/+page.svelte
+++ b/landpage/src/routes/docs/remote-shell/+page.svelte
@@ -28,9 +28,9 @@
server: 'npm install -g @authmesh/agent',
},
{
- label: 'Binary',
- controller: 'curl -sLO https://github.com/ameshdev/amesh/releases/latest/download/amesh-darwin-arm64.tar.gz\ntar xzf amesh-darwin-arm64.tar.gz && sudo mv amesh /usr/local/bin/',
- server: 'curl -sLO https://github.com/ameshdev/amesh/releases/latest/download/amesh-linux-x64.tar.gz\ntar xzf amesh-linux-x64.tar.gz && sudo mv amesh-agent /usr/local/bin/',
+ label: 'Shell',
+ controller: 'curl -fsSL https://authmesh.dev/install | sh',
+ server: 'curl -fsSL https://authmesh.dev/install | sh',
},
];
let activeInstallMethod = $state(0);
diff --git a/landpage/static/install b/landpage/static/install
new file mode 100644
index 0000000..5ec2f9d
--- /dev/null
+++ b/landpage/static/install
@@ -0,0 +1,155 @@
+#!/bin/sh
+# Install script for amesh — device-bound M2M authentication.
+# Usage: curl -fsSL https://authmesh.dev/install | sh
+#
+# Detects OS and architecture, downloads the latest release from GitHub,
+# and installs amesh + amesh-agent into /usr/local/bin (or ~/.local/bin).
+#
+# Environment variables:
+# AMESH_VERSION — install a specific version (e.g., "0.5.1")
+# AMESH_INSTALL — custom install directory (default: /usr/local/bin or ~/.local/bin)
+
+set -e
+
+REPO="ameshdev/amesh"
+BASE_URL="https://github.com/${REPO}/releases"
+
+# --- Helpers ---
+
+log() {
+ printf '%s\n' "$1"
+}
+
+err() {
+ printf 'Error: %s\n' "$1" >&2
+ exit 1
+}
+
+need() {
+ command -v "$1" >/dev/null 2>&1 || err "required command not found: $1"
+}
+
+# --- Detect platform ---
+
+detect_os() {
+ case "$(uname -s)" in
+ Linux*) echo "linux" ;;
+ Darwin*) echo "darwin" ;;
+ *) err "unsupported OS: $(uname -s)" ;;
+ esac
+}
+
+detect_arch() {
+ case "$(uname -m)" in
+ x86_64|amd64) echo "x64" ;;
+ aarch64|arm64) echo "arm64" ;;
+ *) err "unsupported architecture: $(uname -m)" ;;
+ esac
+}
+
+# --- Resolve version ---
+
+resolve_version() {
+ if [ -n "${AMESH_VERSION}" ]; then
+ echo "${AMESH_VERSION}"
+ return
+ fi
+
+ # Fetch latest release tag from GitHub API
+ need curl
+ tag=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" \
+ | grep '"tag_name"' | head -1 | sed 's/.*"v\(.*\)".*/\1/')
+ [ -n "$tag" ] || err "could not determine latest version"
+ echo "$tag"
+}
+
+# --- Choose install directory ---
+
+choose_install_dir() {
+ if [ -n "${AMESH_INSTALL}" ]; then
+ echo "${AMESH_INSTALL}"
+ return
+ fi
+
+ if [ -w /usr/local/bin ]; then
+ echo "/usr/local/bin"
+ elif command -v sudo >/dev/null 2>&1; then
+ echo "/usr/local/bin"
+ else
+ mkdir -p "${HOME}/.local/bin"
+ echo "${HOME}/.local/bin"
+ fi
+}
+
+needs_sudo() {
+ [ ! -w "$1" ] && command -v sudo >/dev/null 2>&1
+}
+
+# --- Main ---
+
+main() {
+ need curl
+ need tar
+
+ OS=$(detect_os)
+ ARCH=$(detect_arch)
+ VERSION=$(resolve_version)
+ INSTALL_DIR=$(choose_install_dir)
+
+ TARBALL="amesh-${VERSION}-${OS}-${ARCH}.tar.gz"
+ URL="${BASE_URL}/download/v${VERSION}/${TARBALL}"
+
+ log "Installing amesh v${VERSION} (${OS}/${ARCH})"
+ log " from: ${URL}"
+ log " to: ${INSTALL_DIR}"
+
+ # Download and extract to a temp directory
+ TMPDIR=$(mktemp -d)
+ trap 'rm -rf "$TMPDIR"' EXIT
+
+ curl -fsSL "$URL" -o "${TMPDIR}/${TARBALL}" \
+ || err "download failed — check that v${VERSION} exists for ${OS}-${ARCH}"
+
+ tar -xzf "${TMPDIR}/${TARBALL}" -C "$TMPDIR"
+
+ # Install binaries
+ if needs_sudo "$INSTALL_DIR"; then
+ sudo install -m 755 "${TMPDIR}/amesh" "${INSTALL_DIR}/amesh"
+ sudo install -m 755 "${TMPDIR}/amesh-agent" "${INSTALL_DIR}/amesh-agent"
+ # macOS Secure Enclave helper (only present in darwin tarballs)
+ if [ -f "${TMPDIR}/amesh-se-helper" ]; then
+ sudo install -m 755 "${TMPDIR}/amesh-se-helper" "${INSTALL_DIR}/amesh-se-helper"
+ fi
+ else
+ install -m 755 "${TMPDIR}/amesh" "${INSTALL_DIR}/amesh"
+ install -m 755 "${TMPDIR}/amesh-agent" "${INSTALL_DIR}/amesh-agent"
+ if [ -f "${TMPDIR}/amesh-se-helper" ]; then
+ install -m 755 "${TMPDIR}/amesh-se-helper" "${INSTALL_DIR}/amesh-se-helper"
+ fi
+ fi
+
+ # Verify
+ if "${INSTALL_DIR}/amesh" --version >/dev/null 2>&1; then
+ INSTALLED_VERSION=$("${INSTALL_DIR}/amesh" --version 2>&1)
+ log ""
+ log "amesh installed: ${INSTALLED_VERSION}"
+ else
+ log ""
+ log "amesh installed to ${INSTALL_DIR}/amesh"
+ fi
+
+ # Warn if install dir is not in PATH
+ case ":${PATH}:" in
+ *":${INSTALL_DIR}:"*) ;;
+ *)
+ log ""
+ log "Note: ${INSTALL_DIR} is not in your PATH."
+ log " Add it with: export PATH=\"${INSTALL_DIR}:\$PATH\""
+ ;;
+ esac
+
+ log ""
+ log "Get started: amesh init"
+}
+
+main
diff --git a/packaging/nfpm.yaml b/packaging/nfpm.yaml
index 49b7e1c..58d702f 100644
--- a/packaging/nfpm.yaml
+++ b/packaging/nfpm.yaml
@@ -1,5 +1,5 @@
name: amesh
-arch: amd64
+arch: "${DEB_ARCH}"
platform: linux
version: "${VERSION}"
maintainer: "amesh "
@@ -11,3 +11,7 @@ contents:
dst: /usr/bin/amesh
file_info:
mode: 0755
+ - src: ./dist/amesh-agent
+ dst: /usr/bin/amesh-agent
+ file_info:
+ mode: 0755