Skip to content
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,14 @@ Learn more <a href="https://docs.maxun.dev/robot/search/search-introduction">her
### Getting Started
The simplest & fastest way to get started is to use the hosted version: https://app.maxun.dev.

### One-Click Self Host (Railway)

Deploy Maxun on Railway with a prewired multi-service stack (nginx gateway, frontend, backend, remote Chromium, PostgreSQL, and MinIO):

[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/maxun?referralCode=ToZEjF&utm_medium=integration&utm_source=button&utm_campaign=maxun)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== README excerpt =="
if [ -f README.md ]; then
  sed -n '115,145p' README.md
else
  echo "README.md not found"
fi

echo
echo "== Search Railway references =="
rg -n "railway|Railway" README.md .github . 2>/dev/null | head -n 100 || true

echo
echo "== Git status/stat =="
git status --short
git diff --stat HEAD 2>/dev/null || true

Repository: getmaxun/maxun

Length of output: 2953


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Resolving Railway page metadata via HTTP headers/body snippets =="
python3 - <<'PY'
import urllib.request

url = "https://railway.com/deploy/maxun"
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
with urllib.request.urlopen(req, timeout=20) as r:
    print("status", r.status)
    print("final-url", r.geturl())
    text = r.read(81920).decode("utf-8", "replace")
for needle in ["osbytes/template-maxun", "dillonstreator", "maxun", "Deploy on Railway", "template"]:
    count = text.lower().count(needle.lower())
    print(f"{needle}: {count}")
    for i,line in enumerate(text.splitlines(),1):
        if needle.lower() in line.lower():
            print(f"line {i}: {line.strip()[:240]}")
            if i > 5:
                print("(truncated)")
                break
PY

Repository: getmaxun/maxun

Length of output: 2812


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Fetch Railway deploy page with trusted certs =="
python3 - <<'PY'
import urllib.request, ssl, sys
url = "https://railway.com/deploy/maxun"
try_certs = [True, False]
for verify in try_certs:
    ctx = ssl.create_default_context() if verify else ssl._create_unverified_context()
    try:
        with urllib.request.urlopen(urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}), context=ctx, timeout=20) as r:
            print("status", r.status, "url", r.geturl())
            text = r.read(120000).decode("utf-8", "replace", errors="replace")
            for needle in ["osbytes/template-maxun", "dillonstreator", "maxun", "Deploy on Railway"]:
                found = [i+1 for i,line in enumerate(text.splitlines(),1) if needle.lower() in line.lower()][:12]
                print(f"{needle}: hit lines {found}")
            print("snippet relevant:")
            for i,line in enumerate(text.splitlines(),1):
                if any(s in line.lower() for s in ["github", "template", "deploy", "railway", "osbytes", "dillonstreator"]):
                    print(f"{i}: {line[:300]}")
    except Exception as e:
        print("verify=" if verify else "no-verify=", type(e).__name__, str(e))
PY

echo
echo "Alternative cURL probe =="
URL="https://railway.com/deploy/maxun"
set +e
status=$(curl -Is --max-time 20 "$URL" | head -n 1 | awk '{print $2}')
printf "curl_status=%s\n" "$status"
[ -n "$status" ] || exit 0
curl -L -s --max-time 20 "$URL" | python3 - <<'PY'
import sys
text=sys.stdin.read()
for needle in ["osbytes/template-maxun", "dillonstreator", "maxun", "Deploy on Railway"]:
    hits=[i+1 for i,line in enumerate(text.splitlines(),1) if needle.lower() in line.lower()][:16]
    print(f"{needle}: {hits}")
PY

Repository: getmaxun/maxun

Length of output: 588


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Fetch Railway deploy page body via curl with headers =="
curl -L -s --max-time 30 -D - https://railway.com/deploy/maxun \
  -H "User-Agent: Mozilla/5.0" -H "Accept: text/html,*/*" > /tmp/railway_deploy_maxun.html

echo "== response excerpt =="
sed -n '1,120p' /tmp/railway_deploy_maxun.html

echo "== relevant line searches =="
python3 - <<'PY'
from pathlib import Path
path = Path("/tmp/railway_deploy_maxun.html")
text = path.read_bytes().decode("utf-8", errors="replace")
needles = ["osbytes", "dillonstreator", "template", "maxun", "git", "railway.com/deploy/maxun", "github"]
for needle in needles:
    hits=[]
    for i,line in enumerate(text.splitlines(), 1):
        if needle in line:
            hits.append(i)
    print(f"{needle}: {hits[:10]}")
PY

Repository: getmaxun/maxun

Length of output: 11556


Verify the Railway template’s source and authorization before presenting it as the recommended self-hosted path.

The Railway deploy page references osbytes/template-maxun and dillonstreator in its metadata, while this README presents it under getmaxun/maxun. Because this path provisions services and stores application secrets, either link to a template owned/maintained under the Maxun project or explicitly label it as a community-authored deployment template.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 124, Update the Railway deployment badge in README.md to
either reference a Railway template owned and maintained by the Maxun project or
clearly label the existing external template as community-authored before
presenting it as a self-hosted recommendation.


After deploy, open only the **gateway** public URL so the UI and API share one origin (required for Maxun's httpOnly auth cookie). Optional `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` unlock AI mode.

### Installation
Maxun can run locally with or without Docker
1. [Setup with Docker Compose](https://docs.maxun.dev/installation/docker)
Expand All @@ -125,9 +133,10 @@ Maxun can run locally with or without Docker
4. [SDK](https://github.com/getmaxun/node-sdk)

### Upgrading & Self Hosting
1. [Self Host Maxun With Docker](https://docs.maxun.dev/self-host)
2. [Upgrade Maxun With Docker Compose Setup](https://docs.maxun.dev/installation/upgrade#upgrading-with-docker-compose)
3. [Upgrade Maxun Without Docker Compose Setup](https://docs.maxun.dev/installation/upgrade#upgrading-with-local-setup)
1. [One-Click Self Host on Railway](https://railway.com/deploy/maxun?referralCode=ToZEjF&utm_medium=integration&utm_source=button&utm_campaign=maxun)
2. [Self Host Maxun With Docker](https://docs.maxun.dev/self-host)
3. [Upgrade Maxun With Docker Compose Setup](https://docs.maxun.dev/installation/upgrade#upgrading-with-docker-compose)
4. [Upgrade Maxun Without Docker Compose Setup](https://docs.maxun.dev/installation/upgrade#upgrading-with-local-setup)

## Features

Expand Down