Arcology is designed to allow a writer to publish writing from across their org-roam Knowledge Base to multiple domains, interlinking between them where necessary. Each site can provide its own CSS – and maybe eventually its own page template – and some minimal metadata, all of which are stored in dataclasses which are meant to be used as courtesy classes to store data for the HTML generator and link router.
import arcology.sites
= "arcology"
site_name
arcology.sites.sites.get(site_name) arcology.sites.doc
from dataclasses import dataclass
from typing import Optional, List
from enum import Enum
from arcology.config import Environment as Env
from arcology.config import get_settings
@dataclass
class Site():
str
key: dict[Env, List[str]]
domains: str
title: str]
css_file: Optional[str]
node_color: Optional[
def get_domains(self, env: Env = get_settings().arcology_env):
return self.domains.get(env, [])
= dict() sites
from functools import lru_cache
from typing import Optional
= get_settings().arcology_env
env
@lru_cache(maxsize=16)
def host_to_site(host: str) -> Optional[Site]:
for site in sites.values():
= site.domains.get(env)
domains if domains is None:
raise Exception(f"no domains for site {site}+{env}?")
if host in domains:
return site
Arcology FastAPI Self-Hosting
Of course this thing self-hosts. :)
= Site(
arcology ="arcology",
key={
domains"engine.arcology.garden"],
Env.prod: ["engine.arcology.garden:8000"]
Env.dev: [
},="The Arcology Site Engine",
title=None,
css_file="#67b4f8"
node_color
)"arcology"] = arcology sites[
The Lion's Rear
= Site(
lionsrear ="lionsrear",
key={
domains"thelionsrear.com"],
Env.prod: ["dev.thelionsrear.com:8000"]
Env.dev: [
},="The Lion's Rear",
title="/static/css/lionsrear.css",
css_file="#87af87"
node_color
)"lionsrear"] = lionsrear sites[
:root {
--alert: #CC6960;
--primary: #707231;
--secondary: #ebbe7b;
--success: #67b4f8;
--warning: #7e5c41;
--white: #87af87;
--light-gray: #cfdcc2;
--medium-gray: #a0aa96;
--dark-gray: #82796C;
--black: #211F1C;
}
body {background-color: var(--white);
}
.backlinks {
sectionpadding: 0.5em;
border-radius: 1em;
background-color: var(--light-gray);
margin-bottom: 2em;
margin-top: 1em;
}
,code {
prefont-weight: bold;
}
The Arcology Garden
= Site(
garden ="garden",
key={
domains"arcology.garden"],
Env.prod: ["dev.arcology.garden:8000"]
Env.dev: [
},="The Arcology Garden",
title="/static/css/garden.css",
css_file="#a6dc68"
node_color
)"garden"] = garden sites[
:root {
--alert: #CC6960;
--primary: #707231;
--secondary: #ebbe7b;
--success: #67b4f8;
--warning: #7e5c41;
--white: #fcf6ed;
--light-gray: #f6e5cb;
--medium-gray: #BAAD9B;
--dark-gray: #82796C;
--black: #211F1C;
--bg: #a6dc68;
}
body {background-color: var(--bg);
}
The Complete Computing Environment
= Site(
cce ="cce",
key={
domains"cce.whatthefuck.computer", "cce.rix.si"],
Env.prod: ["dev.cce"],
Env.dev: [
},="The Complete Computing Environment",
title="/static/css/cce.css",
css_file="#cc6960"
node_color
)"cce"] = cce sites[
:root {
--alert: #CC6960;
--primary: #707231;
--secondary: #ebbe7b;
--success: #67b4f8;
--warning: #7e5c41;
--white: #fcfcfc;
--light-gray: #dcdcec;
--medium-gray: #cacada;
--dark-gray: #808090;
--black: #211F1C;
}
body {background-color: var(--dark-gray);
}
Topic Index – the "fact site"
= Site(
doc ="doc",
key={
domains"doc.rix.si"],
Env.prod: ["dev.topics"],
Env.dev: [
},="rrix's fact site",
title="/static/css/docsite.css",
css_file="#ebbe7b"
node_color
)"doc"] = doc sites[
:root {
--alert: #CC6960;
--primary: #707231;
--secondary: #ebbe7b;
--success: #67b4f8;
--warning: #7e5c41;
--white: #fcfcfc;
--light-gray: #dcdcec;
--medium-gray: #cacada;
--dark-gray: #808090;
--black: #211F1C;
}
body {background-color: var(--medium-gray);
}
"local" site for development
= Site(
local ="local",
key={
domains
Env.prod: [],"localhost:8000"],
Env.dev: [
},="localhost",
title="/static/css/docsite.css",
css_file="#211F1C",
node_color
)"local"] = local sites[