site: wanderbooks.ai — one-liner, canonical and social tags, Netlify config and deploy recipes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MtYEaR6M6Ybdhm6X98BWNu
This commit is contained in:
6 files changed
+39
-8
No files matched your search
@@ -2,3 +2,4 @@
|
|||||||
*.orig
|
*.orig
|
||||||
.DS_Store
|
.DS_Store
|
||||||
site/dist/
|
site/dist/
|
||||||
|
.netlify/
|
||||||
@@ -64,7 +64,7 @@ New books, one command (installs Rust and wanderbooks if needed, makes the
|
|||||||
books dir with the MCP server registered for it, and starts the agent):
|
books dir with the MCP server registered for it, and starts the agent):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://git.swaits.com/swaits/wanderbooks/raw/branch/main/install.sh | sh -s -- ~/Books/Acme
|
curl -fsSL https://wanderbooks.ai/install.sh | sh -s -- ~/Books/Acme
|
||||||
```
|
```
|
||||||
|
|
||||||
Already installed: `wanderbooks new ~/Books/Acme`. In a books dir, `just`
|
Already installed: `wanderbooks new ~/Books/Acme`. In a books dir, `just`
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# wanderbooks installer. One line on a new machine:
|
# wanderbooks installer. One line on a new machine:
|
||||||
#
|
#
|
||||||
# curl -fsSL https://git.swaits.com/swaits/wanderbooks/raw/branch/main/install.sh | sh -s -- ~/Books/Acme
|
# curl -fsSL https://wanderbooks.ai/install.sh | sh -s -- ~/Books/Acme
|
||||||
#
|
#
|
||||||
# Linux and macOS. On Windows, run it inside WSL2 (Ubuntu): the GUI opens as
|
# Linux and macOS. On Windows, run it inside WSL2 (Ubuntu): the GUI opens as
|
||||||
# a normal window on Windows 11.
|
# a normal window on Windows 11.
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
set shell := ["bash", "-cu"]
|
set shell := ["bash", "-cu"]
|
||||||
|
|
||||||
|
# The Netlify CLI, fetched on demand.
|
||||||
|
netlify := "npx --yes netlify-cli@27"
|
||||||
|
|
||||||
# List recipes
|
# List recipes
|
||||||
default:
|
default:
|
||||||
@just --list
|
@just --list
|
||||||
@@ -41,6 +44,10 @@ site:
|
|||||||
cp site/index.html install.sh site/dist/
|
cp site/index.html install.sh site/dist/
|
||||||
cp -r site/assets site/dist/
|
cp -r site/assets site/dist/
|
||||||
|
|
||||||
# Publish the website: just publish user@host:/var/www/wanderbooks
|
# Deploy the website to wanderbooks.ai (Netlify; `netlify login` once first)
|
||||||
publish dest: site
|
deploy: site
|
||||||
rsync -av --delete site/dist/ "{{dest}}"
|
{{netlify}} deploy --prod --dir site/dist --no-build
|
||||||
|
|
||||||
|
# Deploy a preview of the website and print its URL
|
||||||
|
deploy-preview: site
|
||||||
|
{{netlify}} deploy --dir site/dist --no-build
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# wanderbooks.ai: the static site in site/, plus install.sh at the root.
|
||||||
|
# `just site` builds the same thing locally; `just deploy` publishes it.
|
||||||
|
[build]
|
||||||
|
command = "rm -rf site/dist && mkdir -p site/dist && cp site/index.html install.sh site/dist/ && cp -r site/assets site/dist/"
|
||||||
|
publish = "site/dist"
|
||||||
|
|
||||||
|
# curl | sh reads plain text; never let a CDN cache an old installer for long.
|
||||||
|
[[headers]]
|
||||||
|
for = "/install.sh"
|
||||||
|
[headers.values]
|
||||||
|
Content-Type = "text/plain; charset=utf-8"
|
||||||
|
Cache-Control = "public, max-age=300"
|
||||||
|
|
||||||
|
[[headers]]
|
||||||
|
for = "/assets/*"
|
||||||
|
[headers.values]
|
||||||
|
Cache-Control = "public, max-age=86400"
|
||||||
+9
-3
@@ -5,6 +5,12 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>wanderbooks — own your books, hire an AI bookkeeper</title>
|
<title>wanderbooks — own your books, hire an AI bookkeeper</title>
|
||||||
<meta name="description" content="Real double-entry bookkeeping in a folder you own, kept by an AI bookkeeper you talk to. No subscription, no lock-in, every number traceable to its receipt. An open-source alternative to QuickBooks Online.">
|
<meta name="description" content="Real double-entry bookkeeping in a folder you own, kept by an AI bookkeeper you talk to. No subscription, no lock-in, every number traceable to its receipt. An open-source alternative to QuickBooks Online.">
|
||||||
|
<link rel="canonical" href="https://wanderbooks.ai/">
|
||||||
|
<meta property="og:title" content="wanderbooks — own your books, hire an AI bookkeeper">
|
||||||
|
<meta property="og:description" content="Real double-entry bookkeeping in a folder you own, kept by an AI bookkeeper you talk to. No subscription, no lock-in.">
|
||||||
|
<meta property="og:url" content="https://wanderbooks.ai/">
|
||||||
|
<meta property="og:image" content="https://wanderbooks.ai/assets/overview.png">
|
||||||
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||||
@@ -117,7 +123,7 @@ footer { padding: 72px 0 48px; color: var(--faint); font-size: 14px; display: fl
|
|||||||
<p class="lede">wanderbooks is real double-entry accounting that lives in <b>a folder you own</b>, kept by <b>an AI bookkeeper you talk to</b>. It finds your receipts, records and categorizes everything, fixes its mistakes the way an accountant would, and hands your CPA a clean package. No subscription. No lock-in. Every number traceable to its receipt.</p>
|
<p class="lede">wanderbooks is real double-entry accounting that lives in <b>a folder you own</b>, kept by <b>an AI bookkeeper you talk to</b>. It finds your receipts, records and categorizes everything, fixes its mistakes the way an accountant would, and hands your CPA a clean package. No subscription. No lock-in. Every number traceable to its receipt.</p>
|
||||||
<div class="install">
|
<div class="install">
|
||||||
<span class="prompt">$</span>
|
<span class="prompt">$</span>
|
||||||
<code id="cmd">curl -fsSL https://git.swaits.com/swaits/wanderbooks/raw/branch/main/install.sh | sh -s -- ~/Books/YourCompany</code>
|
<code id="cmd">curl -fsSL https://wanderbooks.ai/install.sh | sh -s -- ~/Books/YourCompany</code>
|
||||||
<button class="copy" id="copy">Copy</button>
|
<button class="copy" id="copy">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
<p class="note">One line installs everything, makes your books, and starts your bookkeeper. Linux and macOS; Windows via WSL2. Free and open source; you bring <a href="https://claude.com/claude-code">Claude</a>.</p>
|
<p class="note">One line installs everything, makes your books, and starts your bookkeeper. Linux and macOS; Windows via WSL2. Free and open source; you bring <a href="https://claude.com/claude-code">Claude</a>.</p>
|
||||||
@@ -250,10 +256,10 @@ footer { padding: 72px 0 48px; color: var(--faint); font-size: 14px; display: fl
|
|||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
// When served next to install.sh, point the one-liner at this site.
|
// On a preview deploy, point the one-liner at the preview's own install.sh.
|
||||||
(function () {
|
(function () {
|
||||||
var cmd = document.getElementById("cmd");
|
var cmd = document.getElementById("cmd");
|
||||||
if (location.protocol === "https:") {
|
if (location.protocol === "https:" && location.hostname !== "wanderbooks.ai") {
|
||||||
cmd.textContent = "curl -fsSL " + location.origin + "/install.sh | sh -s -- ~/Books/YourCompany";
|
cmd.textContent = "curl -fsSL " + location.origin + "/install.sh | sh -s -- ~/Books/YourCompany";
|
||||||
}
|
}
|
||||||
document.getElementById("copy").addEventListener("click", function () {
|
document.getElementById("copy").addEventListener("click", function () {
|
||||||
|
|||||||
Reference in new issue
Block a user