diff --git a/README.md b/README.md
index 4cdab0f..7aff839 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,23 @@
This is the website for ODE. It is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
+## Documentation versioning
+
+The version selector in the navbar (e.g. **ODE 1.1.2**, **Next (unreleased)**) refers to **ODE product versions**, not the version of the docs site itself.
+
+- **ODE 1.1.2, 1.1.0, 1.0** — Frozen snapshots of the docs as they were when that version of ODE was released. Content lives in `versioned_docs/version-1.1.2/` etc.
+- **Next (unreleased)** — The current docs you edit in the `docs/` folder. This is what you see when working locally; it becomes the next ODE release docs when you run the versioning command.
+
+When you change files in `docs/`, switch the dropdown to **Next (unreleased)** to see your updates. The default “latest” on the site can be set to the current ODE release (e.g. ODE 1.1.2) so most visitors see stable docs.
+
+To freeze the current `docs/` for a new release (e.g. ODE 1.1.3), run:
+
+```bash
+npm run docusaurus docs:version 1.1.3
+```
+
+Then update `versions.json` and the config if you want that version to become the default.
+
## Local Development
```bash
diff --git a/docs/development/formulus-development.md b/docs/development/formulus-development.md
index 24e3fad..b859545 100644
--- a/docs/development/formulus-development.md
+++ b/docs/development/formulus-development.md
@@ -359,7 +359,7 @@ npm install
## Related Documentation
-- [Installing Formulus for Development](/development/installing-formulus-dev) - ADB/emulator setup
+- [Installing Formulus for Development](/docs/development/installing-formulus-dev) - ADB/emulator setup
- [Formulus Reference](/reference/formulus) - Component reference
- [Building and Testing](/development/building-testing) - Build procedures
diff --git a/docs/development/installation.md b/docs/development/installation.md
index 2cf68bc..d2a6d83 100644
--- a/docs/development/installation.md
+++ b/docs/development/installation.md
@@ -317,14 +317,14 @@ Verify the installation:
Formulus is the mobile application component of ODE, available for Android and iOS devices.
-For detailed installation instructions, see the [Installing Formulus guide](/getting-started/installing-formulus) which covers:
+For detailed installation instructions, see the [Installing Formulus guide](/docs/getting-started/installation/installing-formulus) which covers:
- F-Droid installation (recommended for end users)
- Direct APK installation
- System requirements
- Post-installation setup
-For developers who want to install via ADB or emulator, see the [Development Installation guide](/development/installing-formulus-dev).
+For developers who want to install via ADB or emulator, see the [Development Installation guide](/docs/development/installing-formulus-dev).
### Quick Installation Summary
@@ -333,7 +333,7 @@ For developers who want to install via ADB or emulator, see the [Development Ins
1. **F-Droid** (Recommended): Install via F-Droid app store
2. **Direct APK**: Download and install APK file directly
-See [Installing Formulus](/getting-started/installing-formulus) for complete instructions.
+See [Installing Formulus](/docs/getting-started/installation/installing-formulus) for complete instructions.
#### For Developers
@@ -341,7 +341,7 @@ See [Installing Formulus](/getting-started/installing-formulus) for complete ins
2. **Emulator**: Run on Android emulator
3. **Development Build**: Build from source with hot reload
-See [Installing Formulus for Development](/development/installing-formulus-dev) for complete instructions.
+See [Installing Formulus for Development](/docs/development/installing-formulus-dev) for complete instructions.
### App Configuration
diff --git a/docs/development/quick-start.md b/docs/development/quick-start.md
index ede1381..4cd160a 100644
--- a/docs/development/quick-start.md
+++ b/docs/development/quick-start.md
@@ -189,7 +189,7 @@ If data is not synchronizing:
## Related Documentation
-- [Installation Guide](/getting-started/installation)
+- [Installation Guide](/docs/getting-started/installation)
- [Your First Form](/using/your-first-form)
- [Form Design Guide](/guides/form-design)
diff --git a/docs/getting-started/faq.md b/docs/getting-started/faq.md
index f86cf78..da3a365 100644
--- a/docs/getting-started/faq.md
+++ b/docs/getting-started/faq.md
@@ -32,7 +32,7 @@ No, ODE is designed to work offline. Data is stored locally and synchronized whe
### What are the system requirements?
-See the [Prerequisites](/getting-started/installation/prerequisites) page for detailed system requirements.
+See the [Installation](/docs/getting-started/installation) page for detailed system requirements.
### Can I run ODE in the cloud?
diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md
new file mode 100644
index 0000000..4c72ddf
--- /dev/null
+++ b/docs/getting-started/installation.md
@@ -0,0 +1,21 @@
+---
+sidebar_position: 4
+---
+
+# Installation
+
+To run ODE you need two things: a **server** (Synkronus) that stores and syncs data, and a **client** on each device (Formulus or another app) that collects data and talks to the server.
+
+## What to install
+
+| Component | What it is | Guide |
+|-----------|------------|--------|
+| **Server (Synkronus)** | Backend that hosts the API, portal, and database. Runs on a Linux server or VPS. | [Install Synkronus](installation/installing-synkronus) |
+| **Client (Formulus)** | Mobile app for Android that field workers use to fill forms and sync data. | [Install Formulus](installation/installing-formulus) |
+
+Install the server first so that the client has something to connect to. Then install Formulus (or your client app) on each device and point it at your Synkronus server.
+
+## Next steps
+
+- **[Install Synkronus](installation/installing-synkronus)** — Set up the server on a Linux machine or VPS.
+- **[Install Formulus](installation/installing-formulus)** — Put the Formulus app on Android devices and connect it to your server.
diff --git a/docs/getting-started/installing-formulus.md b/docs/getting-started/installation/installing-formulus.md
similarity index 96%
rename from docs/getting-started/installing-formulus.md
rename to docs/getting-started/installation/installing-formulus.md
index d016cf9..c30e127 100644
--- a/docs/getting-started/installing-formulus.md
+++ b/docs/getting-started/installation/installing-formulus.md
@@ -1,5 +1,5 @@
---
-sidebar_position: 4
+sidebar_position: 2
---
# Installing Formulus App
@@ -159,7 +159,7 @@ If Obtainium is not available or you prefer direct installation:
### Method 3: Development Build
-For developers who want to build and install from source, see the [Development Installation Guide](development/formulus-development).
+For developers who want to build and install from source, see the [Development Installation Guide](/docs/development/formulus-development).
## Post-Installation Setup
@@ -300,8 +300,7 @@ After installation, you can find and launch Formulus:
## Related Documentation
-- [Formulus Features](using/formulus-features) - Learn about app features and usage
-- [Your First Form](using/your-first-form) - Get started with data collection
-- [Synchronization](using/synchronization) - Understand how data syncs work
-- [Development Installation](development/formulus-development) - For developers building from source
-
+- [Formulus Features](/docs/using/formulus-features) - Learn about app features and usage
+- [Your First Form](/docs/using/your-first-form) - Get started with data collection
+- [Synchronization](/docs/using/synchronization) - Understand how data syncs work
+- [Development Installation](/docs/development/formulus-development) - For developers building from source
diff --git a/docs/getting-started/installation/installing-synkronus.md b/docs/getting-started/installation/installing-synkronus.md
new file mode 100644
index 0000000..9bbb43d
--- /dev/null
+++ b/docs/getting-started/installation/installing-synkronus.md
@@ -0,0 +1,181 @@
+---
+sidebar_position: 1
+---
+
+# Install Synkronus Server
+
+Setting up the server is often the hardest part of getting started with
+Synkronus. Once the server is running, the rest of the system becomes
+much easier to work with.
+
+**We don't recommend any particular hosting provider.** Any VPS or VM
+that can run Linux and containers is fine. This guide is written for a
+generic Linux server. If you need to create a new server and want a
+concrete example, we show **DigitalOcean** in the next section—use it if
+you like, or skip it and follow the rest of the steps on your own
+machine or provider.
+
+This setup is **not intended for production use**. Later guides cover
+custom domains, proper TLS, backups, logging, and production patterns.
+Here the goal is simply to **get a working server running quickly**.
+
+You will need:
+
+- A machine running **Linux** (we use **Ubuntu 24.04 LTS** in the examples)
+- At least **1–2 GB RAM** (enough for PostgreSQL and Synkronus)
+- Root or sudo access to install packages and run containers
+
+---
+
+## Example: Create a VPS on DigitalOcean
+
+If you already have a server, skip to [Install required tools](#install-required-tools).
+
+If you want to create a new VPS and are happy to use DigitalOcean:
+
+1. Create a DigitalOcean account and go to **Droplets → Create Droplet**.
+2. Choose:
+ - A datacenter location close to you
+ - **Ubuntu 24.04 LTS**
+ - **Shared CPU / 1 GB RAM**
+
+At the time of writing this costs about **$6 USD per month**.
+
+When the droplet is created, note the **public IPv4 address**.
+
+
+
+Click **Console** to open the server terminal, then continue with the steps below.
+
+---
+
+## Install required tools
+
+On your Linux server, install the required packages.
+
+We use **Podman instead of Docker** to keep the stack fully open source.
+Podman is daemonless, OCI-compatible, maintained by Red Hat, and largely
+CLI-compatible with Docker. For workloads like Synkronus it works very well.
+
+```bash
+sudo apt update
+sudo apt install -y podman podman-compose git
+```
+
+---
+
+## Clone the quickstart repository
+
+Clone the Synkronus quickstart repository and run the installer.
+
+
+
+```bash
+git clone --depth 1 https://github.com/OpenDataEnsemble/synkronus-quickstart.git server
+cd server
+chmod +x ./install.sh
+./install.sh
+```
+
+During installation you will be asked:
+
+**Do you have a domain name pointing to this server? (y/n)**
+
+If you **do not have a domain**, answer **n**, then enter the server's
+public IP when prompted.
+
+The installer will configure access using:
+
+**https://``.sslip.io**
+
+This hostname resolves to your IP and works with automatic TLS.
+
+---
+
+## Bring the server online
+
+Start the containers:
+
+```bash
+podman compose up -d
+```
+
+The first startup may take a minute while images are downloaded.
+
+Check that everything is running:
+
+```bash
+podman ps
+```
+
+---
+
+## Access the Synkronus Portal
+
+Once the containers are running, open your browser and go to:
+
+**https://``.sslip.io**
+
+You should see the **Synkronus Portal login screen**.
+
+
+
+Use the **admin username and password printed by the installer**.
+
+---
+
+## TLS and HTTPS
+
+Synkronus uses **Caddy** as a reverse proxy. Caddy automatically
+provisions TLS certificates via Let's Encrypt, handles HTTPS, and
+forwards requests to the Synkronus server. With `sslip.io`, certificates
+are issued automatically.
+
+For this to work, the server must be reachable from the internet on
+**port 80** and **port 443**.
+
+:::caution If the certificate fails initially
+
+Sometimes Let's Encrypt validation fails on first boot if the server
+isn't yet reachable. If you see a certificate error in your browser,
+restart Caddy:
+
+```bash
+podman restart synkronus_caddy
+```
+
+After a short moment, HTTPS should work.
+
+:::
+
+---
+
+## Create a user
+
+After logging in with the admin account, create a user for your client
+applications (e.g. Formulus):
+
+1. Open the **Users** tab.
+2. Click **+ Create User**.
+3. Assign **Read/Write** permissions.
+
+
+
+This user can now be used by Synkronus clients such as **Formulus**.
+
+---
+
+## Alternative networking setups
+
+If you already run a **tunnel service** (e.g. **Cloudflare Zero Trust**
+tunnels), you can skip automatic TLS. When prompted for the public IP
+during installation, enter **localhost**. Caddy will run locally without
+provisioning certificates, and your tunnel can handle HTTPS externally.
+
+---
+
+Your Synkronus server is now running.
+
+
+
+
diff --git a/docs/getting-started/what-is-ode.md b/docs/getting-started/what-is-ode.md
index 8a69fc9..8948f75 100644
--- a/docs/getting-started/what-is-ode.md
+++ b/docs/getting-started/what-is-ode.md
@@ -92,5 +92,5 @@ ODE is built using modern, open-source technologies:
- Learn about [Why ODE?](/getting-started/why-ode) to understand the benefits
- Review [Key Concepts](/getting-started/key-concepts) to understand the terminology
-- Follow the [Installation guide](/getting-started/installation/prerequisites) to set up your environment
+- Follow the [Installation guide](/docs/getting-started/installation) to set up your environment
diff --git a/docs/getting-started/why-ode.md b/docs/getting-started/why-ode.md
index ca3d2de..a30591e 100644
--- a/docs/getting-started/why-ode.md
+++ b/docs/getting-started/why-ode.md
@@ -65,6 +65,6 @@ ODE may not be the best fit if:
## Next Steps
- Review [Key Concepts](/getting-started/key-concepts) to understand ODE terminology
-- Check [Prerequisites](/getting-started/installation/prerequisites) for system requirements
-- Follow the [Installation guide](/getting-started/installation/quick-start) to get started
+- Check the [Installation](/docs/getting-started/installation) guide for system requirements
+- Follow the [Installation guide](/docs/getting-started/installation) to get started
diff --git a/docs/guides/configuration.md b/docs/guides/configuration.md
index cc29d14..4229cb8 100644
--- a/docs/guides/configuration.md
+++ b/docs/guides/configuration.md
@@ -355,6 +355,6 @@ curl http://localhost:8080/health
## Related Documentation
-- [Installation Guide](/getting-started/installation)
+- [Installation Guide](/docs/getting-started/installation)
- [Deployment Guide](/guides/deployment)
- [API Reference](/reference/api)
diff --git a/docs/guides/deployment.md b/docs/guides/deployment.md
index b72d7e0..04276e0 100644
--- a/docs/guides/deployment.md
+++ b/docs/guides/deployment.md
@@ -555,6 +555,6 @@ Before going live:
## Related Documentation
-- [Installation Guide](/getting-started/installation)
+- [Installation Guide](/docs/getting-started/installation)
- [Configuration Guide](/guides/configuration)
- [API Reference](/reference/api)
diff --git a/docs/guides/quick-start-custom-app.md b/docs/guides/quick-start-custom-app.md
index 97d2765..ca5c5dc 100644
--- a/docs/guides/quick-start-custom-app.md
+++ b/docs/guides/quick-start-custom-app.md
@@ -9,7 +9,7 @@ Create and deploy a custom ODE application in 30 minutes using this step-by-step
## What You'll Need
**Prerequisites:**
-- ODE server running (see [Installation Guide](/getting-started/installation))
+- ODE server running (see [Installation Guide](/docs/getting-started/installation))
- Node.js 20+ and npm 10+
- Basic knowledge of React/JavaScript
- Text editor (VS Code recommended)
diff --git a/docs/index.md b/docs/index.md
index 324605f..852ffb3 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -14,7 +14,7 @@ Open Data Ensemble (ODE) is a comprehensive platform for mobile data collection
The source code for the pre-release version of ODE is now publicly available. While we're working toward the full 1.0 release, we welcome anyone willing to help with testing, development, or getting involved in the project.
-**Try the pre-release:** [Install Formulus on Android](/getting-started/installation)
+**Try the pre-release:** [Install Formulus on Android](/docs/getting-started/installation)
**Get involved:** Reach out to us at [hello@opendataensemble.org](mailto:hello@opendataensemble.org) - we'd love to hear from you!
@@ -90,6 +90,6 @@ This documentation is organized to help you find information quickly:
## Next Steps
- Read [What is ODE?](/getting-started/what-is-ode) for a detailed overview
-- Follow the [Installation guide](/getting-started/installation) to set up your environment
+- Follow the [Installation guide](/docs/getting-started/installation) to set up your environment
- Create your [first form](/using/your-first-form) to see ODE in action
- Explore the [API Reference](/reference/api) for technical details
diff --git a/docs/reference/components.md b/docs/reference/components.md
index 3044f58..daaebf2 100644
--- a/docs/reference/components.md
+++ b/docs/reference/components.md
@@ -25,8 +25,8 @@ Formulus is a React Native application that provides offline-first data collecti
### Installation
-- **End Users**: See [Installing Formulus](/getting-started/installing-formulus)
-- **Developers**: See [Installing Formulus for Development](/development/installing-formulus-dev)
+- **End Users**: See [Installing Formulus](/docs/getting-started/installation/installing-formulus)
+- **Developers**: See [Installing Formulus for Development](/docs/development/installing-formulus-dev)
### Configuration
@@ -80,7 +80,7 @@ Synkronus provides a RESTful API for data synchronization, app bundle management
### Installation
-See the [Installation guide](/development/installation) for detailed installation instructions.
+See the [Installation guide](/docs/development/installation) for detailed installation instructions.
### Configuration
@@ -173,7 +173,7 @@ All components work together to provide a complete data collection solution:
## Related Documentation
-- [Installation Guide](/development/installation)
+- [Installation Guide](/docs/development/installation)
- [API Reference](/reference/api)
- [Form Design Guide](/guides/form-design)
- [Custom Applications Guide](/guides/custom-applications)
diff --git a/docs/reference/formulus.md b/docs/reference/formulus.md
index bcfd467..91c84bd 100644
--- a/docs/reference/formulus.md
+++ b/docs/reference/formulus.md
@@ -361,7 +361,7 @@ For complete API documentation, see:
## Related Documentation
- [Formulus Features](/using/formulus-features) - User-facing features
-- [Installing Formulus](/getting-started/installing-formulus) - Installation guide
+- [Installing Formulus](/docs/getting-started/installation/installing-formulus) - Installation guide
- [Formulus Development](/development/formulus-development) - Development setup
- [Synchronization](/using/synchronization) - Sync protocol details
diff --git a/docs/using/formulus-features.md b/docs/using/formulus-features.md
index eda4e64..5243f5b 100644
--- a/docs/using/formulus-features.md
+++ b/docs/using/formulus-features.md
@@ -366,7 +366,7 @@ Data syncs automatically when connection returns.
## Related Documentation
-- [Installing Formulus](/getting-started/installing-formulus) - Installation guide
+- [Installing Formulus](/docs/getting-started/installation/installing-formulus) - Installation guide
- [Your First Form](/using/your-first-form) - Getting started with forms
- [Synchronization](/using/synchronization) - Detailed sync information
- [Working Offline](/using/working-offline) - Offline capabilities
diff --git a/docs/using/troubleshooting.md b/docs/using/troubleshooting.md
index 3df75bf..744996b 100644
--- a/docs/using/troubleshooting.md
+++ b/docs/using/troubleshooting.md
@@ -497,6 +497,6 @@ If you cannot resolve an issue:
## Next Steps
- Review [Synchronization](/using/synchronization) for sync-related issues
-- Check [Installation guides](/getting-started/installation/prerequisites) for setup problems
+- Check [Installation guides](/docs/getting-started/installation) for setup problems
- Explore [API Reference](/reference/api/overview) for integration issues
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 0021a09..da3eb26 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -37,6 +37,19 @@ const config: Config = {
editUrl: 'https://github.com/OpenDataEnsemble/ode/tree/main/ode-docs/',
remarkPlugins: [require('./plugins/fix-docs-links')],
rehypePlugins: [require('./plugins/fix-docs-links-rehype')],
+ // Version dropdown shows ODE product versions (not "docs site" version).
+ // "Next" = current docs/ folder (unreleased); 1.1.2, 1.1.0, 1.0 = frozen snapshots per ODE release.
+ includeCurrentVersion: true,
+ versions: {
+ current: {
+ label: 'Next (unreleased)',
+ path: 'next',
+ },
+ '1.1.2': { label: 'ODE 1.1.2' },
+ '1.1.1': { label: 'ODE 1.1.1' },
+ '1.1.0': { label: 'ODE 1.1.0' },
+ '1.0': { label: 'ODE 1.0' },
+ },
},
pages: {
remarkPlugins: [],
@@ -66,6 +79,12 @@ const config: Config = {
label: 'Documentation',
position: 'right',
},
+ {
+ type: 'docsVersionDropdown',
+ position: 'right',
+ dropdownItemsBefore: [],
+ dropdownItemsAfter: [],
+ },
{
label: 'Components',
position: 'right',
diff --git a/package-lock.json b/package-lock.json
index 372c51a..2b52ac3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,8 +8,8 @@
"name": "ode-docs",
"version": "1.0.0",
"dependencies": {
- "@docusaurus/core": "^3.1.0",
- "@docusaurus/preset-classic": "^3.1.0",
+ "@docusaurus/core": "^3.9.2",
+ "@docusaurus/preset-classic": "^3.9.2",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
@@ -17,8 +17,8 @@
"react-dom": "^18.2.0"
},
"devDependencies": {
- "@docusaurus/module-type-aliases": "^3.1.0",
- "@docusaurus/types": "^3.1.0",
+ "@docusaurus/module-type-aliases": "^3.9.2",
+ "@docusaurus/types": "^3.9.2",
"@types/node": "^20.19.27",
"tsx": "^4.21.0",
"typescript": "^5.2.2"
@@ -5250,15 +5250,6 @@
"node": ">=14.16"
}
},
- "node_modules/@trysound/sax": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
- "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
- "license": "ISC",
- "engines": {
- "node": ">=10.13.0"
- }
- },
"node_modules/@types/body-parser": {
"version": "1.19.6",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@@ -5942,9 +5933,9 @@
}
},
"node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
@@ -8820,9 +8811,9 @@
}
},
"node_modules/file-loader/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
@@ -10622,9 +10613,9 @@
}
},
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"license": "MIT"
},
"node_modules/lodash.debounce": {
@@ -13086,9 +13077,9 @@
"license": "ISC"
},
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -13279,9 +13270,9 @@
}
},
"node_modules/null-loader/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
@@ -15376,9 +15367,9 @@
}
},
"node_modules/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.1.0"
@@ -16278,10 +16269,13 @@
"license": "MIT"
},
"node_modules/sax": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz",
- "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==",
- "license": "BlueOak-1.0.0"
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz",
+ "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
},
"node_modules/scheduler": {
"version": "0.23.2",
@@ -16441,15 +16435,15 @@
}
},
"node_modules/serve-handler": {
- "version": "6.1.6",
- "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz",
- "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==",
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz",
+ "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==",
"license": "MIT",
"dependencies": {
"bytes": "3.0.0",
"content-disposition": "0.5.2",
"mime-types": "2.1.18",
- "minimatch": "3.1.2",
+ "minimatch": "3.1.5",
"path-is-inside": "1.0.2",
"path-to-regexp": "3.3.0",
"range-parser": "1.2.0"
@@ -17100,18 +17094,18 @@
"license": "MIT"
},
"node_modules/svgo": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
- "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz",
+ "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==",
"license": "MIT",
"dependencies": {
- "@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^5.1.0",
"css-tree": "^2.3.1",
"css-what": "^6.1.0",
"csso": "^5.0.5",
- "picocolors": "^1.0.0"
+ "picocolors": "^1.0.0",
+ "sax": "^1.5.0"
},
"bin": {
"svgo": "bin/svgo"
@@ -17178,15 +17172,14 @@
}
},
"node_modules/terser-webpack-plugin": {
- "version": "5.3.16",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz",
- "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==",
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz",
+ "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==",
"license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
"schema-utils": "^4.3.0",
- "serialize-javascript": "^6.0.2",
"terser": "^5.31.1"
},
"engines": {
@@ -17791,9 +17784,9 @@
}
},
"node_modules/url-loader/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
diff --git a/package.json b/package.json
index a1fc636..ef2bc95 100644
--- a/package.json
+++ b/package.json
@@ -17,8 +17,8 @@
"typecheck": "tsc"
},
"dependencies": {
- "@docusaurus/core": "^3.1.0",
- "@docusaurus/preset-classic": "^3.1.0",
+ "@docusaurus/core": "^3.9.2",
+ "@docusaurus/preset-classic": "^3.9.2",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
@@ -26,8 +26,8 @@
"react-dom": "^18.2.0"
},
"devDependencies": {
- "@docusaurus/module-type-aliases": "^3.1.0",
- "@docusaurus/types": "^3.1.0",
+ "@docusaurus/module-type-aliases": "^3.9.2",
+ "@docusaurus/types": "^3.9.2",
"@types/node": "^20.19.27",
"tsx": "^4.21.0",
"typescript": "^5.2.2"
diff --git a/sidebars.ts b/sidebars.ts
index 389428e..95cc387 100644
--- a/sidebars.ts
+++ b/sidebars.ts
@@ -25,7 +25,15 @@ const sidebars: SidebarsConfig = {
'getting-started/what-is-ode',
'getting-started/why-ode',
'getting-started/key-concepts',
- 'getting-started/installing-formulus',
+ {
+ type: 'category',
+ label: 'Installation',
+ link: { type: 'doc', id: 'getting-started/installation' },
+ items: [
+ 'getting-started/installation/installing-synkronus',
+ 'getting-started/installation/installing-formulus',
+ ],
+ },
'getting-started/faq',
],
},
diff --git a/src/css/custom.css b/src/css/custom.css
index ecbff63..3c47373 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -235,6 +235,21 @@ h3 {
margin-top: 2rem;
}
+/* Doc content images: preserve aspect ratio (prevent stretching) */
+.theme-doc-markdown img,
+article img {
+ max-width: 100% !important;
+ width: auto !important;
+ height: auto !important;
+ object-fit: contain !important;
+}
+.theme-doc-markdown p img,
+article p img {
+ max-width: 100% !important;
+ width: auto !important;
+ height: auto !important;
+}
+
/* Professional code blocks */
.prism-code {
border-radius: 6px;
diff --git a/static/img/girrnababy_small.png b/static/img/girrnababy_small.png
new file mode 100644
index 0000000..3086a5a
Binary files /dev/null and b/static/img/girrnababy_small.png differ
diff --git a/static/img/synkronus_install/digiocean_droplet.png b/static/img/synkronus_install/digiocean_droplet.png
new file mode 100644
index 0000000..5104362
Binary files /dev/null and b/static/img/synkronus_install/digiocean_droplet.png differ
diff --git a/static/img/synkronus_install/install_shell.png b/static/img/synkronus_install/install_shell.png
new file mode 100644
index 0000000..4989ab1
Binary files /dev/null and b/static/img/synkronus_install/install_shell.png differ
diff --git a/static/img/synkronus_install/portal_create_user.png b/static/img/synkronus_install/portal_create_user.png
new file mode 100644
index 0000000..45ee01f
Binary files /dev/null and b/static/img/synkronus_install/portal_create_user.png differ
diff --git a/static/img/synkronus_install/portal_welcome.png b/static/img/synkronus_install/portal_welcome.png
new file mode 100644
index 0000000..489ccae
Binary files /dev/null and b/static/img/synkronus_install/portal_welcome.png differ