first commit

This commit is contained in:
2026-10-20 09:41:46 -06:00
commit 2f9031492e
116 changed files with 3737 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
{{- $u := urls.Parse .Destination -}}
{{- $href := .Destination -}}
{{- if and (not $u.IsAbs) (strings.HasPrefix .Destination "/") -}}
{{- $href = relURL (strings.TrimPrefix "/" .Destination) -}}
{{- end -}}
<a href="{{ $href | safeURL }}"{{ with .Title }} title="{{ . }}"{{ end }}{{ if $u.IsAbs }} rel="noopener"{{ end }}>{{ .Text }}</a>
{{- /* chomp */ -}}
+25
View File
@@ -0,0 +1,25 @@
{{/* Application directory grouped by category. Context: dict with "headingLevel". */}}
{{ $apps := (site.GetPage "/apps").Pages }}
{{ $h := .headingLevel | default 2 }}
<div class="directory">
{{ range site.Params.appGroups }}
{{ $group := .name }}
{{ $inGroup := where $apps "Params.category" $group }}
{{ with $inGroup }}
<section class="dir-group" id="{{ $group | anchorize }}">
<header class="dir-group-head">
<h{{ $h }}>{{ $group }}</h{{ $h }}>
</header>
<ul class="dir-list">
{{ range .ByTitle }}
<li class="dir-row">
<a class="dir-name" href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
<span class="dir-desc">{{ .Params.tagline }}</span>
{{ with .Params.replaces }}<span class="dir-replaces"><span class="visually-hidden">Use instead of </span>{{ range $i, $n := first 3 . }}{{ if $i }}<span class="sep">, </span>{{ end }}<s>{{ $n }}</s>{{ end }}</span>{{ end }}
</li>
{{ end }}
</ul>
</section>
{{ end }}
{{ end }}
</div>
+6
View File
@@ -0,0 +1,6 @@
<footer class="site-footer">
<div class="site-footer-inner">
<p>Documentation for applications hosted by <a href="{{ site.Params.companyURL }}">{{ site.Params.company }}</a> on Federated Core. Each application runs on your own virtual machine.</p>
<p>Application names and trademarks belong to their respective projects. Links to upstream documentation open the project's own website.</p>
</div>
</footer>
+23
View File
@@ -0,0 +1,23 @@
<header class="masthead">
<div class="masthead-inner">
<button class="nav-toggle" type="button" aria-controls="sidebar" aria-expanded="false">
<span class="nav-toggle-bars" aria-hidden="true"></span><span class="visually-hidden">Menu</span>
</button>
<a class="brand" href="{{ "/" | relURL }}">
{{ partial "mark.html" . }}
<span class="brand-text">Federated Computer <span class="brand-sub">Docs</span></span>
</a>
<nav class="topnav" aria-label="Primary">
{{ $current := . }}
{{ range site.Menus.main }}
<a href="{{ .URL }}"{{ if or ($current.IsMenuCurrent "main" .) ($current.HasMenuCurrent "main" .) (and .Page ($current.IsDescendant .Page)) }} aria-current="true"{{ end }}>{{ .Name }}</a>
{{ end }}
</nav>
<div class="search" role="search">
<label class="visually-hidden" for="search-input">Search the documentation</label>
<input id="search-input" type="search" placeholder="Search apps and guides" autocomplete="off" spellcheck="false" aria-controls="search-results" aria-expanded="false">
<kbd class="search-key" aria-hidden="true">/</kbd>
<ol id="search-results" class="search-results" hidden></ol>
</div>
</div>
</header>
+1
View File
@@ -0,0 +1 @@
<img class="mark" src="{{ "clifford.svg" | relURL }}" width="32" height="28" alt="">
+15
View File
@@ -0,0 +1,15 @@
{{ $pages := slice }}
{{ if eq .Section "apps" }}
{{ $pages = (site.GetPage "/apps").Pages.ByTitle }}
{{ else }}
{{ with .CurrentSection }}{{ $pages = .Pages.ByWeight }}{{ end }}
{{ end }}
{{ if and $pages (not .IsSection) }}
{{ $prev := $pages.Prev . }}
{{ $next := $pages.Next . }}
{{/* Pages.Next/Prev are reversed relative to reading order */}}
<nav class="pager" aria-label="Previous and next">
{{ with $next }}<a class="pager-prev" href="{{ .RelPermalink }}"><span>Previous</span>{{ .LinkTitle }}</a>{{ end }}
{{ with $prev }}<a class="pager-next" href="{{ .RelPermalink }}"><span>Next</span>{{ .LinkTitle }}</a>{{ end }}
</nav>
{{ end }}
+6
View File
@@ -0,0 +1,6 @@
{{/* Renders the list of proprietary services an app can replace, struck through. */}}
{{ with .Params.replaces }}
<span class="replaces">
{{ range $i, $name := . }}{{ if $i }}<span class="sep">, </span>{{ end }}<s>{{ $name }}</s>{{ end }}
</span>
{{ end }}
+31
View File
@@ -0,0 +1,31 @@
{{ $current := . }}
<nav id="sidebar" class="sidebar" aria-label="Documentation">
{{ with site.GetPage "/getting-started" }}
<div class="side-group">
<a class="side-heading{{ if eq $current . }} is-current{{ end }}" href="{{ .RelPermalink }}"{{ if eq $current . }} aria-current="page"{{ end }}>{{ .Title }}</a>
<ul>
{{ range .Pages.ByWeight }}
<li><a href="{{ .RelPermalink }}"{{ if eq $current . }} aria-current="page"{{ end }}>{{ .LinkTitle }}</a></li>
{{ end }}
</ul>
</div>
{{ end }}
{{ with site.GetPage "/apps" }}
{{ $apps := .Pages }}
<div class="side-group">
<a class="side-heading{{ if eq $current . }} is-current{{ end }}" href="{{ .RelPermalink }}"{{ if eq $current . }} aria-current="page"{{ end }}>Applications</a>
{{ range site.Params.appGroups }}
{{ $group := .name }}
{{ $inGroup := where $apps "Params.category" $group }}
{{ with $inGroup }}
<p class="side-sub">{{ $group }}</p>
<ul>
{{ range .ByTitle }}
<li><a href="{{ .RelPermalink }}"{{ if eq $current . }} aria-current="page"{{ end }}>{{ .LinkTitle }}</a></li>
{{ end }}
</ul>
{{ end }}
{{ end }}
</div>
{{ end }}
</nav>
+5
View File
@@ -0,0 +1,5 @@
<aside class="callout callout-enterprise" role="note">
<p class="callout-title">{{ .Get "title" | default "Enterprise plans only" }}</p>
{{ .Inner | .Page.RenderString (dict "display" "block") }}
<p class="callout-foot">Command-line access is available only when Federated Core was installed with the Enterprise option. <a href="{{ "getting-started/command-line-access/" | relURL }}">What this means</a></p>
</aside>
+4
View File
@@ -0,0 +1,4 @@
<aside class="callout callout-note" role="note">
<p class="callout-title">{{ .Get "title" | default "Note" }}</p>
{{ .Inner | .Page.RenderString (dict "display" "block") }}
</aside>
+1
View File
@@ -0,0 +1 @@
{{- /* Editorial marker. Renders nothing. Usage: {{< review "what to check" >}}. Find all with: grep -rn '< review' content/ */ -}}
+15
View File
@@ -0,0 +1,15 @@
{{- /* Usage: {{< screenshot src="app/name.png" alt="…" caption="…" >}}. Images live in assets/screenshots/. Add demo="true" for screenshots taken on an upstream public demo rather than a Federated Core server. */ -}}
{{- $src := .Get "src" -}}
{{- with resources.Get (printf "screenshots/%s" $src) -}}
{{- $img := . -}}
{{- if gt .Width 1280 }}{{ $img = .Resize "1280x webp q82" }}{{ else }}{{ $img = .Process "webp q82" }}{{ end -}}
<figure class="screenshot">
<a href="{{ .RelPermalink }}"><img src="{{ $img.RelPermalink }}" width="{{ $img.Width }}" height="{{ $img.Height }}" alt="{{ $.Get "alt" }}" loading="lazy" decoding="async"></a>
<figcaption>
{{- with $.Get "caption" }}{{ . | $.Page.RenderString }}{{ end -}}
{{- if eq ($.Get "demo") "true" }} <span class="screenshot-src">Shown on the public demo. Your server may look slightly different.</span>{{ end -}}
</figcaption>
</figure>
{{- else -}}
{{- errorf "screenshot: assets/screenshots/%s not found (%s)" $src $.Position -}}
{{- end -}}
+4
View File
@@ -0,0 +1,4 @@
<aside class="callout callout-superpanel" role="note">
<p class="callout-title">{{ .Get "title" | default "In Superpanel" }}</p>
{{ .Inner | .Page.RenderString (dict "display" "block") }}
</aside>
+4
View File
@@ -0,0 +1,4 @@
<aside class="callout callout-warning" role="note">
<p class="callout-title">{{ .Get "title" | default "Be careful" }}</p>
{{ .Inner | .Page.RenderString (dict "display" "block") }}
</aside>
+28
View File
@@ -0,0 +1,28 @@
<!doctype html>
<html lang="{{ site.Language.Locale | default "en" }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ if .IsHome }}{{ site.Title }}{{ else }}{{ .Title }} | {{ site.Title }}{{ end }}</title>
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ with .Summary }}{{ . | plainify | truncate 160 }}{{ else }}{{ site.Params.description }}{{ end }}{{ end }}">
<link rel="preload" href="{{ "fonts/public-sans-latin-wght-normal.woff2" | relURL }}" as="font" type="font/woff2" crossorigin>
{{ with resources.Get "css/main.css" | minify | fingerprint }}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}">
{{ end }}
<link rel="icon" href="{{ "clifford.svg" | relURL }}" type="image/svg+xml">
</head>
<body class="{{ if .IsHome }}is-home{{ else }}is-doc{{ end }}">
<a class="skip" href="#main">Skip to content</a>
{{ partial "header.html" . }}
<div class="frame">
{{ if not .IsHome }}{{ partial "sidebar.html" . }}{{ end }}
<main id="main" tabindex="-1">
{{ block "main" . }}{{ end }}
</main>
</div>
{{ partial "footer.html" . }}
{{ with resources.Get "js/site.js" | js.Build (dict "minify" true) | fingerprint }}
<script src="{{ .RelPermalink }}" defer data-index="{{ "index.json" | relURL }}"></script>
{{ end }}
</body>
</html>
+30
View File
@@ -0,0 +1,30 @@
{{ define "main" }}
<section class="hero">
<div class="hero-text">
<h1>Your apps, your server, and how to use them.</h1>
<p class="hero-lede">Federated Computer runs a private copy of each application below on a virtual machine dedicated to you. These guides cover what each one does, which paid services it can stand in for, and how to get your work done in it.</p>
<p class="hero-links">
<a class="btn" href="{{ "getting-started/" | relURL }}">Start with the basics</a>
<a class="btn btn-quiet" href="{{ "getting-started/superpanel/" | relURL }}">Manage things in Superpanel</a>
</p>
</div>
<figure class="swap" aria-label="Examples of services you can replace">
<ol class="swap-list">
<li><s>Google Drive</s><span class="swap-arrow" aria-hidden="true"></span><a href="{{ "apps/nextcloud/" | relURL }}">Nextcloud</a></li>
<li><s>Slack</s><span class="swap-arrow" aria-hidden="true"></span><a href="{{ "apps/element/" | relURL }}">Element</a></li>
<li><s>Zoom</s><span class="swap-arrow" aria-hidden="true"></span><a href="{{ "apps/jitsi/" | relURL }}">Jitsi</a></li>
<li><s>1Password</s><span class="swap-arrow" aria-hidden="true"></span><a href="{{ "apps/vaultwarden/" | relURL }}">Vaultwarden</a></li>
<li><s>Calendly</s><span class="swap-arrow" aria-hidden="true"></span><a href="{{ "apps/calcom/" | relURL }}">Cal.com</a></li>
<li><s>DocuSign</s><span class="swap-arrow" aria-hidden="true"></span><a href="{{ "apps/docuseal/" | relURL }}">DocuSeal</a></li>
</ol>
</figure>
</section>
<section class="home-section" aria-labelledby="all-apps">
<div class="home-section-head">
<h2 id="all-apps">All applications</h2>
<p>Grouped by what you would use them for. The struck-through names are the paid services each one can replace.</p>
</div>
{{ partial "directory.html" (dict "headingLevel" 3) }}
</section>
{{ end }}
+13
View File
@@ -0,0 +1,13 @@
{{- $items := slice -}}
{{- range site.RegularPages -}}
{{- $items = $items | append (dict
"title" .Title
"url" .RelPermalink
"section" (cond (eq .Section "apps") (.Params.category | default "Applications") "Getting started")
"tagline" (.Params.tagline | default "")
"replaces" (delimit (.Params.replaces | default slice) ", ")
"headings" (delimit (findRE `(?m)^#{2,3} .+$` .RawContent) " " | replaceRE `#+ ` "")
"body" (.Plain | truncate 1200)
) -}}
{{- end -}}
{{- $items | jsonify -}}
+23
View File
@@ -0,0 +1,23 @@
{{ define "main" }}
<div class="doc-wrap">
<article class="doc">
<header class="doc-head">
<h1>{{ .Title }}</h1>
{{ with .Params.tagline }}<p class="doc-lede">{{ . }}</p>{{ end }}
</header>
<div class="prose">{{ .Content }}</div>
{{ if eq .Section "apps" }}
{{ partial "directory.html" (dict "headingLevel" 2) }}
{{ else }}
<ol class="guide-list">
{{ range .Pages.ByWeight }}
<li>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
{{ with .Params.tagline }}<p>{{ . }}</p>{{ end }}
</li>
{{ end }}
</ol>
{{ end }}
</article>
</div>
{{ end }}
+45
View File
@@ -0,0 +1,45 @@
{{ define "main" }}
<div class="doc-wrap">
<article class="doc">
<header class="doc-head">
{{ with .Params.category }}<p class="doc-kicker"><a href="{{ "apps/" | relURL }}#{{ . | anchorize }}">{{ . }}</a></p>{{ end }}
<h1>{{ .Title }}</h1>
{{ with .Params.tagline }}<p class="doc-lede">{{ . }}</p>{{ end }}
{{ if or .Params.replaces .Params.website }}
<dl class="factsheet">
{{ with .Params.replaces }}
<div><dt>Use instead of</dt><dd>{{ partial "replaces.html" $ }}</dd></div>
{{ end }}
{{ with .Params.address }}
<div><dt>Typical address</dt><dd><code>{{ . }}</code></dd></div>
{{ end }}
{{ with .Params.website }}
<div><dt>Project website</dt><dd><a href="{{ . }}">{{ . | strings.TrimPrefix "https://" | strings.TrimSuffix "/" }}</a></dd></div>
{{ end }}
{{ with .Params.upstreamDocs }}
<div><dt>Official docs</dt><dd><a href="{{ . }}">{{ . | strings.TrimPrefix "https://" | strings.TrimSuffix "/" }}</a></dd></div>
{{ end }}
</dl>
{{ end }}
</header>
<div class="prose">
{{ .Content }}
</div>
{{ with .Params.links }}
<section class="further" aria-labelledby="further-reading">
<h2 id="further-reading">Further reading</h2>
<ul>
{{ range . }}<li><a href="{{ .url }}">{{ .name }}</a></li>{{ end }}
</ul>
</section>
{{ end }}
{{ partial "pager.html" . }}
</article>
{{ if and (ge (len .TableOfContents) 80) (ne .Params.toc false) }}
<aside class="toc" aria-label="On this page">
<p class="toc-title">On this page</p>
{{ .TableOfContents }}
</aside>
{{ end }}
</div>
{{ end }}