Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2b4ed00f4 | ||
|
|
c86df95a0f |
@@ -58,6 +58,25 @@ export default defineConfig({
|
||||
},
|
||||
{ tag: 'meta', attrs: { name: 'twitter:card', content: 'summary_large_image' } },
|
||||
{ tag: 'meta', attrs: { name: 'twitter:image', content: 'https://relplay.org/og-card.png' } },
|
||||
// Privacy-friendly, cookieless analytics (self-hosted Umami). The
|
||||
// Website ID is public by design (it ships in every page). The script
|
||||
// loads from the Umami host, which also becomes the data destination,
|
||||
// so no `data-host-url` is needed.
|
||||
// - data-domains: only run on the production apex, so the
|
||||
// `website.relplay.pages.dev` preview and `staging.relplay.org`
|
||||
// don't pollute the stats.
|
||||
// - data-do-not-track: honour the browser's Do-Not-Track signal
|
||||
// (those visits are not counted at all). See /privacy.
|
||||
{
|
||||
tag: 'script',
|
||||
attrs: {
|
||||
defer: true,
|
||||
src: 'https://umami.oliversturm.com/script.js',
|
||||
'data-website-id': 'fd77cfa5-cffe-4fc8-addb-1c6d7b6d9939',
|
||||
'data-domains': 'relplay.org',
|
||||
'data-do-not-track': true,
|
||||
},
|
||||
},
|
||||
],
|
||||
// Register the simple-mode command grammar with Expressive Code (Shiki).
|
||||
expressiveCode: { shiki: { langs: [rdbmsLang, rdbmsSyntax] } },
|
||||
|
||||
@@ -15,6 +15,8 @@ import Default from '@astrojs/starlight/components/Footer.astro';
|
||||
Made by <a href="https://www.lazyevaluation.biz/">Lazy Evaluation Ltd</a>
|
||||
<span class="sep">·</span>
|
||||
<a href="https://git.lazyeval.net/oli/rdbms-playground">Source & issues</a>
|
||||
<span class="sep">·</span>
|
||||
<a href="/privacy/">Privacy</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
// Pre-selects the install-instructions tab that matches the visitor's OS.
|
||||
//
|
||||
// This piggybacks on Starlight's synced-tabs mechanism rather than fighting it.
|
||||
// A `<Tabs syncKey="install-os">` restores its active tab from
|
||||
// `localStorage["starlight-synced-tabs__install-os"]` via a script Starlight
|
||||
// inlines *before* the tabs render (so there is no flash of the wrong tab). All
|
||||
// we do here is seed that same key with the detected OS — and only when the
|
||||
// visitor has not already chosen a tab themselves, so a manual choice always wins.
|
||||
//
|
||||
// Requirements (mirrors Starlight's own restore script):
|
||||
// - Must be placed *before* the `<Tabs>` it targets, so this runs first.
|
||||
// - The stored value must equal one of the TabItem labels exactly
|
||||
// ("Linux" / "macOS" / "Windows").
|
||||
// - Inlined, so it runs during parse before the restore script's
|
||||
// connectedCallback and paint.
|
||||
---
|
||||
|
||||
<script is:inline>
|
||||
(() => {
|
||||
const KEY = 'starlight-synced-tabs__install-os';
|
||||
try {
|
||||
// A previously stored value is a deliberate user choice — never override it.
|
||||
if (localStorage.getItem(KEY)) return;
|
||||
const data = navigator.userAgentData;
|
||||
const platform = ((data && data.platform) || navigator.platform || '').toLowerCase();
|
||||
const ua = (navigator.userAgent || '').toLowerCase();
|
||||
let os = null;
|
||||
if (platform.includes('win') || ua.includes('windows')) os = 'Windows';
|
||||
else if (platform.includes('mac') || ua.includes('mac os x')) os = 'macOS';
|
||||
else if (platform.includes('linux') || platform.includes('x11') || ua.includes('linux'))
|
||||
os = 'Linux';
|
||||
if (os) localStorage.setItem(KEY, os);
|
||||
} catch (e) {
|
||||
// localStorage unavailable (private mode, blocked cookies, …) — silently
|
||||
// fall back to the default first tab. No detection, no harm.
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
+65
-37
@@ -5,77 +5,105 @@ sidebar:
|
||||
order: 1
|
||||
---
|
||||
|
||||
import { Tabs, TabItem } from '@astrojs/starlight/components';
|
||||
import InstallOsDetect from '../../../components/InstallOsDetect.astro';
|
||||
|
||||
RDBMS Playground is a single self-contained program. There is nothing to
|
||||
configure and no separate database to install — everything it needs is
|
||||
built in.
|
||||
|
||||
Pick whichever method suits your platform. The one-line installers are the
|
||||
quickest if you just want to get going.
|
||||
Pick the tab for your platform — we try to select it automatically — then
|
||||
use whichever method you prefer. The one-line installers are the quickest if
|
||||
you just want to get going.
|
||||
|
||||
## One line
|
||||
<InstallOsDetect />
|
||||
|
||||
These download the matching binary for your machine, verify its checksum,
|
||||
and put it on your `PATH`.
|
||||
<Tabs syncKey="install-os">
|
||||
<TabItem label="Linux">
|
||||
|
||||
### Linux & macOS
|
||||
**One-line installer**
|
||||
|
||||
```sh
|
||||
curl -fsSL https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.sh | sh
|
||||
```
|
||||
|
||||
It detects your operating system and CPU, installs to `~/.local/bin`, and
|
||||
prints a hint if that directory isn't on your `PATH`. Set
|
||||
`RDBMS_INSTALL_DIR` to install somewhere else, or `RDBMS_VERSION=vX.Y.Z` to
|
||||
pin a specific version. Prefer to read a script before running it? It lives
|
||||
at [`scripts/install.sh`](https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.sh).
|
||||
It detects your CPU, installs to `~/.local/bin`, and prints a hint if that
|
||||
directory isn't on your `PATH`. Set `RDBMS_INSTALL_DIR` to install elsewhere,
|
||||
or `RDBMS_VERSION=vX.Y.Z` to pin a version. Prefer to read a script before
|
||||
running it? It lives at
|
||||
[`scripts/install.sh`](https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.sh).
|
||||
|
||||
### Windows (PowerShell)
|
||||
|
||||
```powershell
|
||||
irm https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.ps1 | iex
|
||||
```
|
||||
|
||||
It downloads the matching `.exe`, verifies its checksum, installs to
|
||||
`%LOCALAPPDATA%\Programs\rdbms-playground`, and adds that folder to your
|
||||
user `PATH`. Use `-InstallDir` to choose a different location or `-Version`
|
||||
to pin a release.
|
||||
|
||||
## Package managers
|
||||
|
||||
### Homebrew (macOS & Linux)
|
||||
**Homebrew**
|
||||
|
||||
```sh
|
||||
brew tap lazyeval/tap https://git.lazyeval.net/lazyeval/homebrew-tap
|
||||
brew install lazyeval/tap/rdbms-playground
|
||||
```
|
||||
|
||||
### Scoop (Windows)
|
||||
</TabItem>
|
||||
<TabItem label="macOS">
|
||||
|
||||
**One-line installer**
|
||||
|
||||
```sh
|
||||
curl -fsSL https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.sh | sh
|
||||
```
|
||||
|
||||
It detects your CPU (Apple Silicon or Intel), installs to `~/.local/bin`, and
|
||||
prints a hint if that directory isn't on your `PATH`. Set `RDBMS_INSTALL_DIR`
|
||||
to install elsewhere, or `RDBMS_VERSION=vX.Y.Z` to pin a version. Prefer to
|
||||
read a script before running it? It lives at
|
||||
[`scripts/install.sh`](https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.sh).
|
||||
|
||||
**Homebrew**
|
||||
|
||||
```sh
|
||||
brew tap lazyeval/tap https://git.lazyeval.net/lazyeval/homebrew-tap
|
||||
brew install lazyeval/tap/rdbms-playground
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem label="Windows">
|
||||
|
||||
**One-line installer (PowerShell)**
|
||||
|
||||
```powershell
|
||||
irm https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.ps1 | iex
|
||||
```
|
||||
|
||||
It downloads the matching `.exe`, verifies its checksum, installs to
|
||||
`%LOCALAPPDATA%\Programs\rdbms-playground`, and adds that folder to your user
|
||||
`PATH`. Use `-InstallDir` to choose a different location or `-Version` to pin
|
||||
a release.
|
||||
|
||||
**Scoop**
|
||||
|
||||
```sh
|
||||
scoop bucket add lazyeval https://git.lazyeval.net/lazyeval/scoop-bucket
|
||||
scoop install rdbms-playground
|
||||
```
|
||||
|
||||
### winget (Windows)
|
||||
**winget**
|
||||
|
||||
:::note
|
||||
A winget package (`winget install LazyEvaluation.RdbmsPlayground`) is on its
|
||||
way and awaiting review in the public winget catalogue. Until it lands, use
|
||||
Scoop or the PowerShell one-liner above.
|
||||
:::
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## With cargo
|
||||
|
||||
If you have a Rust toolchain, you can install from
|
||||
These work on any platform with a Rust toolchain. Install from
|
||||
[crates.io](https://crates.io/crates/rdbms-playground):
|
||||
|
||||
```sh
|
||||
cargo install rdbms-playground
|
||||
```
|
||||
|
||||
For a faster install that fetches a prebuilt binary instead of compiling,
|
||||
use [`cargo-binstall`](https://github.com/cargo-bins/cargo-binstall)
|
||||
(install it first — it is not part of `cargo` itself):
|
||||
For a faster install that fetches a prebuilt binary instead of compiling, use
|
||||
[`cargo-binstall`](https://github.com/cargo-bins/cargo-binstall) (install it
|
||||
first — it is not part of `cargo` itself):
|
||||
|
||||
```sh
|
||||
cargo binstall rdbms-playground
|
||||
@@ -83,11 +111,11 @@ cargo binstall rdbms-playground
|
||||
|
||||
## Prebuilt binaries
|
||||
|
||||
Every release publishes static Linux, standalone Windows, and macOS
|
||||
binaries (x86_64 and aarch64), each with a `.sha256` checksum, on the
|
||||
Every release publishes static Linux, standalone Windows, and macOS binaries
|
||||
(x86_64 and aarch64), each with a `.sha256` checksum, on the
|
||||
[releases page](https://git.lazyeval.net/oli/rdbms-playground/releases).
|
||||
Download the one for your platform, make it executable if needed, and put
|
||||
it somewhere on your `PATH`.
|
||||
Download the one for your platform, make it executable if needed, and put it
|
||||
somewhere on your `PATH`.
|
||||
|
||||
## Run it
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: Privacy
|
||||
description: What we measure on this site, and what we don't. No cookies, no personal data.
|
||||
tableOfContents: false
|
||||
---
|
||||
|
||||
This site is run as a free teaching tool, not a business that profiles its
|
||||
visitors. We keep the analytics deliberately minimal.
|
||||
|
||||
## What we collect
|
||||
|
||||
We measure aggregate usage with **[Umami](https://umami.is/)**, a
|
||||
privacy-friendly analytics tool that we **host ourselves** (on
|
||||
`umami.oliversturm.com`). Nothing is sent to a third-party advertising
|
||||
network.
|
||||
|
||||
For each page view we record:
|
||||
|
||||
- the page you viewed and the site you arrived from (the referrer),
|
||||
- your browser, operating system, and device type,
|
||||
- an approximate **country**.
|
||||
|
||||
That's it. The numbers are aggregated into counts — how many people read a
|
||||
page, which pages are popular — and are never combined into a profile of an
|
||||
individual.
|
||||
|
||||
## What we don't do
|
||||
|
||||
- **No cookies, and nothing stored on your device.** The tracker sets no
|
||||
cookies and writes nothing to local storage. You can confirm this in your
|
||||
browser's developer tools — there are no entries to clear.
|
||||
- **No personal data.** Your IP address is used for a moment on our own
|
||||
server to derive the approximate country and to tell repeated page-loads
|
||||
apart within a single day; it is **not stored**.
|
||||
- **No cross-site tracking.** We cannot and do not follow you to other sites,
|
||||
and we never sell or share what we measure.
|
||||
|
||||
## Your choices
|
||||
|
||||
If your browser sends a **Do Not Track** signal, we honour it: those visits
|
||||
are not counted at all.
|
||||
|
||||
Because the analytics use no cookies and store nothing on your device, there
|
||||
is no cookie banner to dismiss — there is simply nothing to consent to.
|
||||
|
||||
## Questions
|
||||
|
||||
This site and its analytics are operated by
|
||||
[Lazy Evaluation Ltd](https://www.lazyevaluation.biz/). If you have any
|
||||
questions about what we measure, get in touch through the contact details
|
||||
there.
|
||||
Reference in New Issue
Block a user