RIDM Apps App Hosting

Connect a GitHub repository and every push is built, deployed and published at <name>.ridm.ai. Every app gets its own PostgreSQL database, so you can store members, posts and records right away. Host apps built on the Saju (Four Pillars of Destiny) API, or ordinary web apps that don't use the API at all.

Apply in My Apps Deployment guide Plans & pricing Domain Search

Deploy in four steps

  1. Apply — pick a plan and an address (subdomain) in My Apps in the console.
  2. Connect GitHub — install the GitHub App ridm-apps-builder and pick a repository and branch. It only gets read access to the repository.
  3. Push — every push to the connected branch starts a build; build history and failure logs appear on the app screen.
  4. Publish — a successful build goes through automatic checks and goes live right away. Paid plan charges don't start until your first deployment is live.

Static sites with only HTML, CSS and JS also go up as a container (Dockerfile). Put the files in public/ and add the Dockerfile below to the repository root. Requirements such as port 3000 and user 1000 are in the deployment guide.

FROM busybox:1.36
COPY --chown=1000:1000 public /www
USER 1000:1000
EXPOSE 3000
CMD ["httpd", "-f", "-p", "3000", "-h", "/www"]

Hosting large 3D and image-heavy static sites

Sites with tens of MB of models (.glb) and textures, such as three.js games, should use nginx:alpine instead of busybox. busybox httpd can't set cache headers and serves .glb and .ktx2 as generic files. Put the two files below in the repository root and the build output (dist/ with Vite) is served as is.

# Dockerfile
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:1.27-alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build --chown=1000:1000 /app/dist /usr/share/nginx/html
USER 1000:1000
EXPOSE 3000
ENTRYPOINT ["nginx", "-g", "daemon off;"]
# nginx.conf — runs as user 1000 on a read-only file system: only /tmp is writable.
worker_processes 1;
pid /tmp/nginx.pid;
error_log /dev/stderr warn;

events { worker_connections 1024; }

http {
    include /etc/nginx/mime.types;
    # 3D types missing from the stock mime.types (.wasm is already there).
    types {
        model/gltf-binary glb;
        model/gltf+json   gltf;
        image/ktx2        ktx2;
    }
    default_type application/octet-stream;

    client_body_temp_path /tmp/client_temp;
    proxy_temp_path       /tmp/proxy_temp;
    fastcgi_temp_path     /tmp/fastcgi_temp;
    uwsgi_temp_path       /tmp/uwsgi_temp;
    scgi_temp_path        /tmp/scgi_temp;

    access_log off;
    server_tokens off;
    sendfile on;
    tcp_nopush on;

    # Text formats only. .glb / .ktx2 / images are already compressed.
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_comp_level 5;
    gzip_types text/css application/javascript text/javascript application/json
               image/svg+xml model/gltf+json application/wasm text/plain;

    # /assets/ = bundler output whose names carry a content hash (Vite default).
    map $uri $cache_control {
        ~^/assets/ "public, max-age=31536000, immutable";
        ~*\.(?:glb|gltf|bin|ktx2|basis|hdr|webp|avif|png|jpe?g|svg|mp3|ogg|wasm|js|css|woff2?)$ "public, max-age=3600";
        default    "no-cache";
    }
    # Errors (404 etc.) are never cached, so a file added later shows up at once.
    map $status $cache_header {
        ~^(200|206|304)$ $cache_control;
        default          "no-store";
    }

    server {
        listen 3000;
        root /usr/share/nginx/html;

        add_header Cache-Control $cache_header always;
        # Keeps the site out of search results. Delete this line to be indexed.
        add_header X-Robots-Tag "noindex, nofollow" always;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

What's included

Plans

See the pricing page for each plan's price, memory, database size and monthly transfer. If you cancel, the app stops at the end of the period you've already paid for, and for 30 days after that you can download your data or restore the app.

Limits to know

For the full conditions, see the deployment guide and Chapter 3 of the Terms of Service (Korean).

Want to build one from scratch?

Members-only web app with AI (Korean) is a free, hands-on ebook: give your AI coding tool one starting sentence and it walks you through sign-up and sign-in, a members-only notepad, and publishing on RIDM Apps. To build a Saju app, see All-in-one fortune AI (Korean); to start with the Saju API integration, see the developer Get Started guide.

To build without code, assemble an app from Saju and fortune blocks in Baro (block-based app builder) and upload the downloaded deployment bundle to RIDM Apps as is.

For everything from building to servers, databases and domains in one place, see one-stop app development.

Contact: contact@float.do · Operated by FLOAT Co., Ltd.