diff --git a/.sops.yaml b/.sops.yaml
index 0a7fd5f..6078d69 100644
--- a/.sops.yaml
+++ b/.sops.yaml
@@ -46,3 +46,15 @@ creation_rules:
- *emily
age:
- *girldick
+ - path_regex: secrets/hosts/seras.yaml
+ key_groups:
+ - pgp:
+ - *emily
+ age:
+ - *seras
+ - path_regex: secrets/services/akkoma.yaml
+ key_groups:
+ - pgp:
+ - *emily
+ age:
+ - *seras
diff --git a/config/hosts/seras/configuration.nix b/config/hosts/seras/configuration.nix
index b4e062b..34b2ee8 100644
--- a/config/hosts/seras/configuration.nix
+++ b/config/hosts/seras/configuration.nix
@@ -1,10 +1,11 @@
-{ ... }: {
+{ ... }: {
imports = [
../../common
../../profiles/builder.nix
../../profiles/headless.nix
../../profiles/kartoffel.nix
../../profiles/lxc.nix
+ ../../services/akkoma
../../services/nginx.nix
../../services/hydra
../../services/update-nixfiles.nix
diff --git a/config/services/akkoma/default.nix b/config/services/akkoma/default.nix
new file mode 100644
index 0000000..2bec116
--- /dev/null
+++ b/config/services/akkoma/default.nix
@@ -0,0 +1,280 @@
+{ config, pkgs, ... }: {
+ sops.secrets."services/akkoma/mailerPassword" = {
+ sopsFile = ../../../secrets/services/akkoma.yaml;
+ };
+ sops.secrets."services/akkoma/deepl" = {
+ sopsFile = ../../../secrets/services/akkoma.yaml;
+ };
+ services.akkoma = {
+ enable = true;
+ extraStatic."emoji/blobs.gg" = pkgs.akkoma-emoji.blobs_gg;
+
+ extraStatic."static/styles.json" = pkgs.writeText "styles.json" (builtins.toJSON {
+ pleroma-dark = "/static/themes/pleroma-dark.json";
+ pleroma-light = "/static/themes/pleroma-light.json";
+ pleroma-amoled = [ "Pleroma Dark AMOLED" "#000000" "#111111" "#b0b0b1" "#d8a070" "#aa0000" "#0fa00f" "#0095ff" "#d59500"];
+ classic-dark = [ "Classic Dark" "#161c20" "#282e32" "#b9b9b9" "#baaa9c" "#d31014" "#0fa00f" "#0095ff" "#ffa500" ];
+ bird = [ "Bird" "#f8fafd" "#e6ecf0" "#14171a" "#0084b8" "#e0245e" "#17bf63" "#1b95e0" "#fab81e"];
+ ir-black = [ "Ir Black" "#000000" "#242422" "#b5b3aa" "#ff6c60" "#FF6C60" "#A8FF60" "#96CBFE" "#FFFFB6" ];
+ monokai = [ "Monokai" "#272822" "#383830" "#f8f8f2" "#f92672" "#F92672" "#a6e22e" "#66d9ef" "#f4bf75" ];
+
+ redmond-xx = "/static/themes/redmond-xx.json";
+ redmond-xx-se = "/static/themes/redmond-xx-se.json";
+ redmond-xxi = "/static/themes/redmond-xxi.json";
+ breezy-dark = "/static/themes/breezy-dark.json";
+ breezy-light = "/static/themes/breezy-light.json";
+ paper = "/static/themes/paper.json";
+ thekanata = "/static/themes/thekanata.json";
+ ihatebeingalive = "/static/themes/ihatebeingalive.json";
+ elly-mod = "/static/themes/elly-mod.json";
+ });
+
+ extraStatic."static/themes/elly-mod.json" = pkgs.writeText "elly-mod.json" (builtins.readFile ./elly-mod.json);
+
+ extraStatic."static/terms-of-service.html" = pkgs.writeText "terms-of-service.html" ''
+
Likes are now florps. The timeline goes sideways.
+ '';
+
+ extraStatic."images/akkoma-wp.png" = pkgs.fetchurl {
+ url = "https://kyouma.net/akkoma-wp.avif";
+ hash = "sha256-p0slibhwLExsGUzCSZHIl6tNm28r4fB3iJsI6peRFRs=";
+ };
+
+ extraStatic."favicon.png" = let
+ rev = "697a8211b0f427a921e7935a35d14bb3e32d0a2c";
+ in pkgs.stdenvNoCC.mkDerivation {
+ name = "favicon.png";
+
+ src = pkgs.fetchurl {
+ url = "https://raw.githubusercontent.com/TilCreator/NixOwO/${rev}/NixOwO_plain.svg";
+ hash = "sha256-tWhHMfJ3Od58N9H5yOKPMfM56hYWSOnr/TGCBi8bo9E=";
+ };
+
+ nativeBuildInputs = with pkgs; [ librsvg ];
+
+ dontUnpack = true;
+ installPhase = ''
+ rsvg-convert -o $out -w 96 -h 96 $src
+ '';
+ };
+
+ frontends = {
+ primary = {
+ package = pkgs.akkoma-fe-domi;
+ name = "akkoma-fe";
+ ref = "5f0339ce00";
+ };
+ admin = {
+ package = pkgs.akkoma-frontends.admin-fe;
+ name = "admin-fe";
+ ref = "stable";
+ };
+ };
+ };
+ services.akkoma.config = let
+ inherit ((pkgs.formats.elixirConf { }).lib) mkRaw mkAtom mkMap;
+ in {
+ ":pleroma" = {
+ ":instance" = {
+ name = "florp.social";
+ email = "contact@florp.social";
+ notify_email = "akkoma@florp.social";
+ description = "Likes are now florps. The timeline goes sideways.";
+ instance_thumbnail = "/instance/thumbnail.avif";
+ limit = 69420;
+ description_limit = 69420;
+ remote_limit = 131072;
+ upload_limit = 160 * 1024 * 1024;
+ avatar_upload_limit = 16 * 1024 * 1024;
+ background_upload_limit = 32 * 1024 * 1024;
+ banner_upload_limit = 32 * 1024 * 1024;
+ registrations_open = true;
+ registration_reason_length = 2048;
+ account_approval_required = true;
+ account_activation_required = true;
+ federation = false;
+ federation_incoming_replies_max_depth = 1024;
+ max_pinned_statuses = 10;
+ safe_dm_mentions = true;
+ remote_post_retention_days = 365;
+ user_bio_length = 8192;
+ user_name_length = 64;
+ max_account_fields = 8;
+ cleanup_attachments = true;
+ local_bubble = [
+ "solitary.social"
+ "donotsta.re"
+ "chaos.social"
+ ];
+ };
+
+ "Pleroma.Captcha".method = mkRaw "Pleroma.Captcha.Kocaptcha";
+
+ "Pleroma.Web.Endpoint".url.host = "florp.social";
+
+ "Pleroma.Emails.Mailer" = {
+ enabled = true;
+ adapter = mkRaw "Swoosh.Adapters.SMTP";
+ relay = "mail.kyouma.net";
+ username = "akkoma@florp.social";
+ password._secret = config.sops.secrets."services/akkoma/mailerPassword".path;
+ port = 465;
+ ssl = true;
+ auth = mkRaw ":always";
+ };
+
+ ":database".rum_enabled = true;
+
+ ":media_proxy" = {
+ enabled = true;
+ base_url = "https://cache.florp.social";
+ proxy_opts.redirect_on_failure = true;
+ proxy_opts.max_body_length = 64 * 1024 * 1024;
+ };
+
+ ":media_preview_proxy" = {
+ enabled = false;
+ thumbnail_max_width = 1920;
+ thumbnail_max_height = 1080;
+ min_content_length = 128 * 1024;
+ };
+
+ "Pleroma.Upload".base_url = "https://media.florp.social";
+
+ "Pleroma.Upload".filters = map mkRaw [
+ "Pleroma.Upload.Filter.Exiftool.ReadDescription"
+ "Pleroma.Upload.Filter.Exiftool.StripMetadata"
+ "Pleroma.Upload.Filter.Dedupe"
+ "Pleroma.Upload.Filter.AnonymizeFilename"
+ ];
+
+ ":mrf".policies = map mkRaw [
+ "Pleroma.Web.ActivityPub.MRF.SimplePolicy"
+ "Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy"
+ ];
+
+ ":mrf_simple" = {
+ reject = mkMap {
+ "bae.st" = "harassment";
+ "brighteon.social" = "incompatible";
+ "detroitriotcity.com" = "incompatible";
+ "freeatlantis.com" = "incompatible";
+ "freespeechextremist.com" = "incompatible";
+ "gab.com" = "incompatible";
+ "gleasonator.com" = "incompatible";
+ "kitsunemimi.club" = "incompatible";
+ "poa.st" = "incompatible";
+ "seal.cafe" = "harassment";
+ "social.quodverum.com" = "incompatible";
+ "spinster.xyz" = "incompatible";
+ "truthsocial.co.in" = "incompatible";
+ "varishangout.net" = "incompatible";
+
+ "activitypub-troll.cf" = "security";
+ "misskey-forkbomb.cf" = "security";
+ "repl.co" = "security";
+ };
+
+ followers_only = mkMap {
+ "bitcoinhackers.org" = "annoying";
+ };
+ };
+
+ ":mrf_object_age".threshold = 90 * 24 * 3600;
+
+ ":frontend_configurations" = {
+ pleroma_fe = mkMap {
+ background = "/images/akkoma-wp.png";
+ collapseMessageWithSubject = true;
+ hideSiteFavicon = true;
+ streaming = true;
+ webPushNotifications = true;
+ useStreamingApi = true;
+ scopeCopy = true;
+ showFeaturesPanel = false;
+ subjectLineBehavior = "masto";
+ alwaysShowSubjectInput = true;
+ postContentType = "text/markdown";
+ modalOnRepeat = true;
+ minimalScopesMode = true;
+ redirectRootNoLogin = "/about";
+ translationLanguage = "EN";
+ theme = "elly-mod";
+ };
+ };
+
+ ":restrict_unauthenticated" = {
+ timelines = mkMap {
+ local = false;
+ federated = true;
+ };
+ };
+
+ ":translator" = {
+ enabled = true;
+ module = mkRaw "Pleroma.Akkoma.Translators.DeepL";
+ };
+
+ ":deepl" = {
+ tier = mkAtom ":free";
+ api_key._secret = config.sops.secrets."services/akkoma/deepl".path;
+ };
+ };
+
+ ":web_push_encryption".":vapid_details" = {
+ subject = "mailto:contact@florp.social";
+ };
+
+ ":joken".":default_signer"._secret = "/var/lib/secrets/akkoma/jwt-signer";
+ };
+ services.postgresql.extraPlugins = [
+ pkgs.postgresql15Packages.rum
+ ];
+ services.nginx = {
+ package = pkgs.tengine;
+ clientMaxBodySize = "256m";
+ commonHttpConfig = ''
+ proxy_cache_path /var/cache/nginx/cache/akkoma-media-cache
+ levels= keys_zone=akkoma_media_cache:32m max_size=32g
+ inactive=1y use_temp_path=off;
+
+ access_log off;
+ '';
+ };
+ kyouma.nginx.virtualHosts = {
+ "florp.social".locations."/".proxyPass = "http://unix:/run/akkoma/socket";
+
+ "media.florp.social" = {
+ useACMEHost = "florp.social";
+ locations."/".proxyPass = "http://unix:/run/akkoma/socket";
+ };
+
+ "cache.florp.social" = {
+ useACMEHost = "florp.social";
+ locations."/" = {
+ proxyPass = "http://unix:/run/akkoma/socket";
+ extraConfig = ''
+ proxy_cache akkoma_media_cache;
+
+ # Cache objects in slices of 1 MiB
+ slice 1m;
+ proxy_cache_key $host$uri$is_args$args$slice_range;
+ proxy_set_header Range $slice_range;
+
+ # Decouple proxy and upstream responses
+ proxy_buffering on;
+ proxy_cache_lock on;
+ proxy_ignore_client_abort on;
+
+ # Default cache times for various responses
+ proxy_cache_valid 200 1y;
+ proxy_cache_valid 206 301 304 1h;
+
+ # Allow serving of stale items
+ proxy_cache_use_stale error timeout invalid_header updating;
+ '';
+ };
+ };
+ };
+ security.acme.certs."florp.social".extraDomainNames = [ "cache.florp.social" "media.florp.social" ];
+}
diff --git a/config/services/akkoma/elly-mod.json b/config/services/akkoma/elly-mod.json
new file mode 100644
index 0000000..36be1d6
--- /dev/null
+++ b/config/services/akkoma/elly-mod.json
@@ -0,0 +1,529 @@
+{
+ "_pleroma_theme_version": 2,
+ "name": "elly's theme (mod)",
+ "theme": {
+ "themeEngineVersion": 3,
+ "shadows": {
+ "panel": [
+ {
+ "color": "#000000",
+ "x": "1",
+ "y": "2",
+ "blur": "6",
+ "spread": 0,
+ "alpha": 0.6
+ }
+ ],
+ "topBar": [
+ {
+ "x": 0,
+ "y": 0,
+ "blur": 4,
+ "spread": 0,
+ "color": "#000000",
+ "alpha": 0.6
+ }
+ ],
+ "popup": [
+ {
+ "x": 2,
+ "y": 2,
+ "blur": 3,
+ "spread": 0,
+ "color": "#000000",
+ "alpha": 0.5
+ }
+ ],
+ "avatar": [
+ {
+ "x": 0,
+ "y": 1,
+ "blur": 8,
+ "spread": 0,
+ "color": "#000000",
+ "alpha": 0.7
+ }
+ ],
+ "avatarStatus": [],
+ "panelHeader": [
+ {
+ "color": "#ffffff",
+ "x": 0,
+ "y": "40",
+ "blur": "40",
+ "spread": "-40",
+ "inset": true,
+ "alpha": "0.1"
+ }
+ ],
+ "button": [
+ {
+ "color": "#ffffff",
+ "x": 0,
+ "y": "0",
+ "blur": "0",
+ "spread": "1",
+ "alpha": "0.15",
+ "inset": true
+ },
+ {
+ "color": "#000000",
+ "x": "1",
+ "y": "1",
+ "blur": "1",
+ "spread": 0,
+ "alpha": "0.3",
+ "inset": false
+ }
+ ],
+ "buttonHover": [
+ {
+ "color": "#318cbc",
+ "x": 0,
+ "y": "0",
+ "blur": 0,
+ "spread": "1",
+ "alpha": 1,
+ "inset": true
+ },
+ {
+ "color": "#000000",
+ "x": "1",
+ "y": "1",
+ "blur": "1",
+ "spread": 0,
+ "alpha": "0.3",
+ "inset": false
+ }
+ ],
+ "buttonPressed": [
+ {
+ "color": "#bebebe",
+ "x": 0,
+ "y": 0,
+ "blur": "0",
+ "spread": "50",
+ "alpha": 0.5,
+ "inset": true
+ },
+ {
+ "color": "#ffffff",
+ "x": 0,
+ "y": "0",
+ "blur": 0,
+ "spread": "1",
+ "alpha": 0.2,
+ "inset": true
+ },
+ {
+ "color": "#000000",
+ "x": "1",
+ "y": "1",
+ "blur": 0,
+ "spread": 0,
+ "alpha": "0.3",
+ "inset": false
+ }
+ ],
+ "input": [
+ {
+ "color": "#FFFFFF",
+ "x": 0,
+ "y": "0",
+ "blur": 0,
+ "spread": "1",
+ "alpha": "0.2",
+ "inset": true
+ }
+ ]
+ },
+ "colors": {
+ "underlay": "#000000",
+ "bg": "#070e1b",
+ "fg": "#31363b",
+ "cRed": "#c42d38",
+ "cGreen": "#22b325",
+ "cOrange": "#d7d720",
+ "cBlue": "#ffffff",
+ "accent": "#3daee9",
+ "link": "#318cbc",
+ "text": "#bebebe",
+ "badgeNotification": "#024297",
+ "badgeNotificationText": "#ffffff",
+ "alertNeutral": "#bebebe",
+ "alertNeutralText": "#ffffff",
+ "alertPopupNeutral": "#bebebe",
+ "alertPopupNeutralText": "#000000",
+ "alertSuccess": "#22b325",
+ "alertSuccessText": "#ffffff",
+ "alertPopupSuccess": "#22b325",
+ "alertPopupSuccessText": "#000000",
+ "alertWarning": "#d7d720",
+ "alertWarningText": "#ffffff",
+ "alertPopupWarning": "#d7d720",
+ "alertPopupWarningText": "#000000",
+ "alertError": "#ff090f",
+ "alertErrorText": "#bebebe",
+ "alertPopupError": "#ff090f",
+ "alertPopupErrorText": "#ffffff",
+ "panel": "#0d1a31",
+ "panelText": "#bebebe",
+ "alertNeutralPanelText": "#ffffff",
+ "alertSuccessPanelText": "#ffffff",
+ "alertWarningPanelText": "#ffffff",
+ "alertErrorPanelText": "#bebebe",
+ "fgText": "#bebebe",
+ "topBar": "#0d1a31",
+ "topBarText": "#bebebe",
+ "input": "#18223d",
+ "inputTopbarText": "#bebebe",
+ "inputPanelText": "#bebebe",
+ "inputText": "#bebebe",
+ "btn": "#18223d",
+ "btnText": "#bebebe",
+ "btnTopBarText": "#bebebe",
+ "btnDisabled": "#0c121c",
+ "btnDisabledTopBarText": "#393d45",
+ "btnPanelText": "#bebebe",
+ "btnDisabledPanelText": "#393d45",
+ "btnDisabledText": "#393d45",
+ "btnToggled": "#1b1d1f",
+ "btnToggledTopBarText": "#bebebe",
+ "btnToggledPanelText": "#bebebe",
+ "btnToggledText": "#bebebe",
+ "btnPressed": "#1b1d1f",
+ "btnPressedTopBarText": "#bebebe",
+ "btnPressedTopBar": "#1b1d1f",
+ "btnPressedPanelText": "#bebebe",
+ "btnPressedPanel": "#1b1d1f",
+ "btnPressedText": "#bebebe",
+ "tabActiveText": "#bebebe",
+ "tabText": "#bebebe",
+ "tab": "#1b1d1f",
+ "fgLink": "#543fe7",
+ "topBarLink": "#bebebe",
+ "panelLink": "#38a5ed",
+ "panelFaint": "#bebebe",
+ "icon": "#63666d",
+ "poll": "#1d4f6e",
+ "pollText": "#bebebe",
+ "border": "#363c41",
+ "postCyantext": "#ffffff",
+ "postGreentext": "#22b325",
+ "postLink": "#3daee9",
+ "lightText": "#f2f2f2",
+ "popover": "#070e1b",
+ "selectedMenuPopover": "#0d1930",
+ "highlight": "#0d1930",
+ "highlightText": "#bebebe",
+ "selectedMenu": "#0d1930",
+ "selectedMenuText": "#bebebe",
+ "selectedMenuPopoverIcon": "#666c77",
+ "highlightLink": "#3daee9",
+ "selectedMenuLink": "#3daee9",
+ "selectedMenuPopoverLink": "#3daee9",
+ "selectedMenuPopoverText": "#bebebe",
+ "faintLink": "#3daee9",
+ "highlightFaintLink": "#3daee9",
+ "selectedMenuFaintLink": "#3daee9",
+ "selectedMenuPopoverFaintLink": "#3daee9",
+ "faint": "#bebebe",
+ "highlightFaintText": "#bebebe",
+ "selectedMenuFaintText": "#bebebe",
+ "selectedMenuPopoverFaintText": "#bebebe",
+ "highlightLightText": "#f2f2f2",
+ "selectedMenuLightText": "#f2f2f2",
+ "selectedMenuPopoverLightText": "#f2f2f2",
+ "selectedMenuIcon": "#666c77",
+ "selectedPost": "#0d1930",
+ "selectedPostText": "#bebebe",
+ "selectedPostIcon": "#666c77",
+ "selectedPostLink": "#3daee9",
+ "selectedPostFaintLink": "#3daee9",
+ "highlightPostLink": "#3daee9",
+ "selectedPostPostLink": "#3daee9",
+ "selectedPostLightText": "#f2f2f2",
+ "selectedPostFaintText": "#bebebe",
+ "popoverText": "#bebebe",
+ "popoverIcon": "#63666d",
+ "popoverLink": "#3daee9",
+ "postFaintLink": "#3daee9",
+ "popoverPostFaintLink": "#3daee9",
+ "popoverFaintLink": "#3daee9",
+ "popoverFaintText": "#bebebe",
+ "popoverPostLink": "#3daee9",
+ "popoverLightText": "#f2f2f2",
+ "highlightIcon": "#666c77",
+ "highlightPostFaintLink": "#3daee9",
+ "profileTint": "#070e1b",
+ "profileBg": "#03070f",
+ "wallpaper": "#050a13"
+ },
+ "opacity": {
+ "underlay": 0.15,
+ "bg": 0.85,
+ "alert": 0.5,
+ "alertPopup": 0.95,
+ "panel": 0.75,
+ "input": 0.9,
+ "btn": 0.9,
+ "faint": 0.5,
+ "border": 0.55,
+ "popover": 1,
+ "profileTint": 0.5
+ },
+ "radii": {
+ "btn": "3",
+ "input": "4",
+ "checkbox": "1",
+ "panel": "3",
+ "avatar": "4",
+ "avatarAlt": "4",
+ "tooltip": 2,
+ "attachment": "3"
+ },
+ "fonts": {
+ "interface": {
+ "family": "sans-serif"
+ },
+ "input": {
+ "family": "inherit"
+ },
+ "post": {
+ "family": "inherit"
+ },
+ "postCode": {
+ "family": "monospace"
+ }
+ }
+ },
+ "source": {
+ "themeEngineVersion": 3,
+ "fonts": {},
+ "shadows": {
+ "panel": [
+ {
+ "x": "1",
+ "y": "2",
+ "blur": "6",
+ "spread": 0,
+ "color": "#000000",
+ "alpha": 0.6
+ }
+ ],
+ "button": [
+ {
+ "x": 0,
+ "y": "0",
+ "blur": "0",
+ "spread": "1",
+ "color": "#ffffff",
+ "alpha": "0.15",
+ "inset": true
+ },
+ {
+ "x": "1",
+ "y": "1",
+ "blur": "1",
+ "spread": 0,
+ "color": "#000000",
+ "alpha": "0.3",
+ "inset": false
+ }
+ ],
+ "panelHeader": [
+ {
+ "x": 0,
+ "y": "40",
+ "blur": "40",
+ "spread": "-40",
+ "inset": true,
+ "color": "#ffffff",
+ "alpha": "0.1"
+ }
+ ],
+ "buttonHover": [
+ {
+ "x": 0,
+ "y": "0",
+ "blur": 0,
+ "spread": "1",
+ "color": "--link",
+ "alpha": 1,
+ "inset": true
+ },
+ {
+ "x": "1",
+ "y": "1",
+ "blur": "1",
+ "spread": 0,
+ "color": "#000000",
+ "alpha": "0.3",
+ "inset": false
+ }
+ ],
+ "buttonPressed": [
+ {
+ "x": 0,
+ "y": 0,
+ "blur": "0",
+ "spread": "50",
+ "color": "--faint",
+ "alpha": 0.5,
+ "inset": true
+ },
+ {
+ "x": 0,
+ "y": "0",
+ "blur": 0,
+ "spread": "1",
+ "color": "#ffffff",
+ "alpha": 0.2,
+ "inset": true
+ },
+ {
+ "x": "1",
+ "y": "1",
+ "blur": 0,
+ "spread": 0,
+ "color": "#000000",
+ "alpha": "0.3",
+ "inset": false
+ }
+ ],
+ "input": [
+ {
+ "x": 0,
+ "y": "0",
+ "blur": 0,
+ "spread": "1",
+ "color": "#FFFFFF",
+ "alpha": "0.2",
+ "inset": true
+ }
+ ]
+ },
+ "opacity": {
+ "bg": "0.85",
+ "border": "0.55",
+ "panel": "0.75",
+ "btn": "0.9",
+ "input": "0.9"
+ },
+ "colors": {
+ "bg": "#070e1b",
+ "fg": "#31363b",
+ "text": "#bebebe",
+ "underlay": "#000000",
+ "link": "#318cbc",
+ "accent": "#3daee9",
+ "faint": "#bebebe",
+ "faintLink": "#3daee9",
+ "postFaintLink": "#3daee9",
+ "cBlue": "#ffffff",
+ "cRed": "#c42d38",
+ "cGreen": "#22b325",
+ "cOrange": "#d7d720",
+ "highlight": "#0d1930",
+ "highlightLightText": "#f2f2f2",
+ "highlightPostLink": "#3daee9",
+ "highlightFaintText": "#bebebe",
+ "highlightFaintLink": "#3daee9",
+ "highlightPostFaintLink": "#3daee9",
+ "highlightText": "#bebebe",
+ "highlightLink": "#3daee9",
+ "highlightIcon": "#666c77",
+ "popover": "#070e1b",
+ "popoverLightText": "#f2f2f2",
+ "popoverPostLink": "#3daee9",
+ "popoverFaintText": "#bebebe",
+ "popoverFaintLink": "#3daee9",
+ "popoverPostFaintLink": "#3daee9",
+ "popoverText": "#bebebe",
+ "popoverLink": "#3daee9",
+ "popoverIcon": "#63666d",
+ "selectedPost": "#0d1930",
+ "selectedPostFaintText": "#bebebe",
+ "selectedPostLightText": "#f2f2f2",
+ "selectedPostPostLink": "#3daee9",
+ "selectedPostFaintLink": "#3daee9",
+ "selectedPostText": "#bebebe",
+ "selectedPostLink": "#3daee9",
+ "selectedPostIcon": "#666c77",
+ "selectedMenu": "#0d1930",
+ "selectedMenuLightText": "#f2f2f2",
+ "selectedMenuFaintText": "#bebebe",
+ "selectedMenuFaintLink": "#3daee9",
+ "selectedMenuText": "#bebebe",
+ "selectedMenuLink": "#3daee9",
+ "selectedMenuIcon": "#666c77",
+ "selectedMenuPopover": "#0d1930",
+ "selectedMenuPopoverLightText": "#f2f2f2",
+ "selectedMenuPopoverFaintText": "#bebebe",
+ "selectedMenuPopoverFaintLink": "#3daee9",
+ "selectedMenuPopoverText": "#bebebe",
+ "selectedMenuPopoverLink": "#3daee9",
+ "selectedMenuPopoverIcon": "#666c77",
+ "lightText": "#f2f2f2",
+ "postLink": "#3daee9",
+ "border": "#363c41",
+ "poll": "#1d4f6e",
+ "pollText": "#bebebe",
+ "icon": "#63666d",
+ "fgText": "#bebebe",
+ "fgLink": "#543fe7",
+ "panel": "#0d1a31",
+ "panelText": "#bebebe",
+ "panelFaint": "#bebebe",
+ "panelLink": "#38a5ed",
+ "topBar": "#0d1a31",
+ "topBarText": "#bebebe",
+ "topBarLink": "#bebebe",
+ "tab": "#1b1d1f",
+ "tabText": "#bebebe",
+ "tabActiveText": "#bebebe",
+ "btn": "#18223d",
+ "btnText": "#bebebe",
+ "btnPanelText": "#bebebe",
+ "btnTopBarText": "#bebebe",
+ "btnPressed": "#1b1d1f",
+ "btnPressedText": "#bebebe",
+ "btnPressedPanel": "#1b1d1f",
+ "btnPressedPanelText": "#bebebe",
+ "btnPressedTopBar": "#1b1d1f",
+ "btnPressedTopBarText": "#bebebe",
+ "btnToggled": "#1b1d1f",
+ "btnToggledText": "#bebebe",
+ "btnToggledPanelText": "#bebebe",
+ "btnToggledTopBarText": "#bebebe",
+ "btnDisabled": "#0c121c",
+ "btnDisabledText": "#393d45",
+ "btnDisabledPanelText": "#393d45",
+ "btnDisabledTopBarText": "#393d45",
+ "input": "#18223d",
+ "inputText": "#bebebe",
+ "inputPanelText": "#bebebe",
+ "inputTopbarText": "#bebebe",
+ "alertError": "#ff090f",
+ "alertErrorText": "#bebebe",
+ "alertErrorPanelText": "#bebebe",
+ "alertWarning": "#d7d720",
+ "alertWarningText": "#ffffff",
+ "alertWarningPanelText": "#ffffff",
+ "alertNeutral": "#bebebe",
+ "alertNeutralText": "#ffffff",
+ "alertNeutralPanelText": "#ffffff",
+ "badgeNotification": "#024297",
+ "badgeNotificationText": "#ffffff"
+ },
+ "radii": {
+ "btn": "3",
+ "input": "4",
+ "checkbox": "1",
+ "panel": "3",
+ "avatar": "4",
+ "avatarAlt": "4",
+ "attachment": "3"
+ }
+ }
+}
diff --git a/flake.lock b/flake.lock
index 38e159b..1e7ad48 100644
--- a/flake.lock
+++ b/flake.lock
@@ -463,11 +463,11 @@
]
},
"locked": {
- "lastModified": 1729104314,
- "narHash": "sha256-pZRZsq5oCdJt3upZIU4aslS9XwFJ+/nVtALHIciX/BI=",
+ "lastModified": 1730302582,
+ "narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=",
"owner": "cachix",
"repo": "git-hooks.nix",
- "rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6",
+ "rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf",
"type": "github"
},
"original": {
@@ -559,26 +559,6 @@
"url": "https://git.lix.systems/lix-project/hydra"
}
},
- "iceshrimp": {
- "inputs": {
- "nixpkgs": [
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1718289195,
- "narHash": "sha256-xmkExjsTztXW4/AYb3d3Er6Wwg4r7AVwq7rv9E93+Ec=",
- "ref": "refs/heads/dev",
- "rev": "746c6319d3425ccfacc906535c67951e161996d9",
- "revCount": 47,
- "type": "git",
- "url": "https://iceshrimp.dev/iceshrimp/packaging"
- },
- "original": {
- "type": "git",
- "url": "https://iceshrimp.dev/iceshrimp/packaging"
- }
- },
"ixx": {
"inputs": {
"flake-utils": [
@@ -693,11 +673,11 @@
]
},
"locked": {
- "lastModified": 1729982130,
- "narHash": "sha256-HmLLQbX07rYD0RXPxbf3kJtUo66XvEIX9Y+N5QHQ9aY=",
+ "lastModified": 1730184279,
+ "narHash": "sha256-6OB+WWR6gnaWiqSS28aMJypKeK7Pjc2Wm6L0MtOrTuA=",
"owner": "lnl7",
"repo": "nix-darwin",
- "rev": "2eb472230a5400c81d9008014888b4bff23bcf44",
+ "rev": "b379bd4d872d159e5189053ce9a4adf86d56db4b",
"type": "github"
},
"original": {
@@ -795,11 +775,11 @@
},
"nixos-hardware": {
"locked": {
- "lastModified": 1730161780,
- "narHash": "sha256-z5ILcmwMtiCoHTXS1KsQWqigO7HJO8sbyK7f7wn9F/E=",
+ "lastModified": 1730368399,
+ "narHash": "sha256-F8vJtG389i9fp3k2/UDYHMed3PLCJYfxCqwiVP7b9ig=",
"owner": "nixos",
"repo": "nixos-hardware",
- "rev": "07d15e8990d5d86a631641b4c429bc0a7400cfb8",
+ "rev": "da14839ac5f38ee6adbdb4e6db09b5eef6d6ccdc",
"type": "github"
},
"original": {
@@ -926,11 +906,11 @@
},
"nixpkgs_4": {
"locked": {
- "lastModified": 1729880355,
- "narHash": "sha256-RP+OQ6koQQLX5nw0NmcDrzvGL8HDLnyXt/jHhL1jwjM=",
+ "lastModified": 1730200266,
+ "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "18536bf04cd71abd345f9579158841376fdd0c5a",
+ "rev": "807e9154dcb16384b1b765ebe9cd2bba2ac287fd",
"type": "github"
},
"original": {
@@ -957,11 +937,11 @@
"treefmt-nix": "treefmt-nix_2"
},
"locked": {
- "lastModified": 1730214386,
- "narHash": "sha256-FNXiFunXR2DnNrjmA0ofLznTTHcEDJjNWvCQtQExtL0=",
+ "lastModified": 1730368298,
+ "narHash": "sha256-5z4pDqRSSovXPPtN1BNEJOkGoCd/XSYuCWh8AsvoTio=",
"owner": "nix-community",
"repo": "nixvim",
- "rev": "7d882356a486cf44b7fab842ac26885ecd985af3",
+ "rev": "42ea1626cb002fa759a6b1e2841bfc80a4e59615",
"type": "github"
},
"original": {
@@ -980,11 +960,11 @@
]
},
"locked": {
- "lastModified": 1730044642,
- "narHash": "sha256-DbyV9l3hkrSWcN34S6d9M4kAFss0gEHGtjqqMdG9eAs=",
+ "lastModified": 1730337772,
+ "narHash": "sha256-uTxvqDohfG85+zldO5Tf1B+fuAF8ZhMouNwG5S6OAnA=",
"owner": "NuschtOS",
"repo": "search",
- "rev": "e373332c1f8237fc1263901745b0fe747228c8ba",
+ "rev": "4e0a7a95a3df3333771abc4df6a656e7baf67106",
"type": "github"
},
"original": {
@@ -1018,7 +998,6 @@
"flake-utils": "flake-utils",
"home-manager": "home-manager",
"hydra": "hydra",
- "iceshrimp": "iceshrimp",
"kyouma-www": "kyouma-www",
"lix": "lix",
"lix-module": "lix-module",
@@ -1224,11 +1203,11 @@
]
},
"locked": {
- "lastModified": 1730025913,
- "narHash": "sha256-Y9NtFmP8ciLyRsopcCx1tyoaaStKeq+EndwtGCgww7I=",
+ "lastModified": 1730321837,
+ "narHash": "sha256-vK+a09qq19QNu2MlLcvN4qcRctJbqWkX7ahgPZ/+maI=",
"owner": "numtide",
"repo": "treefmt-nix",
- "rev": "bae131e525cc8718da22fbeb8d8c7c43c4ea502a",
+ "rev": "746901bb8dba96d154b66492a29f5db0693dbfcc",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 54cc1fa..266eb9d 100644
--- a/flake.nix
+++ b/flake.nix
@@ -29,10 +29,6 @@
url = "git+https://git.lix.systems/lix-project/hydra?ref=main&rev=799441dcf6d595efb0def686ca0815aef398627b";
inputs.lix.follows = "lix";
};
- iceshrimp = {
- url = "git+https://iceshrimp.dev/iceshrimp/packaging";
- inputs.nixpkgs.follows = "nixpkgs";
- };
kyouma-www = {
url = "git+https://woof.rip/emily/kyouma-net.git";
inputs.nixpkgs.follows = "nixpkgs";
diff --git a/pkgs/akkoma-fe-domi/default.nix b/pkgs/akkoma-fe-domi/default.nix
new file mode 100644
index 0000000..83781a2
--- /dev/null
+++ b/pkgs/akkoma-fe-domi/default.nix
@@ -0,0 +1,40 @@
+{
+ akkoma-frontends,
+ fetchFromGitea,
+ fetchYarnDeps
+}:
+akkoma-frontends.akkoma-fe.overrideAttrs (let
+ src = fetchFromGitea {
+ domain = "git.sakamoto.pl";
+ owner = "domi";
+ repo = "akkoma-fe";
+ rev = "5f0339ce005ccb12365128089edb5fd77f60841b";
+ hash = "sha256-AHmJyOFmQZXmNMMsp8ONm9Itns1H/idEKl8+sxn2RSA=";
+ };
+ offlineCache = fetchYarnDeps {
+ yarnLock = "${src}/yarn.lock";
+ hash = "sha256-7WB6nmxNckMdftKds2OgD2kClvCCT/I5vmthV0jrkSs=";
+ };
+in {
+ version = "unstable-2024-07-20";
+ pname = "akkoma-fe-domi";
+ inherit src offlineCache;
+ postPatch = ''
+ # Build scripts assume to be used within a Git repository checkout
+ sed -E -i '/^let commitHash =/,/;$/clet commitHash = "${builtins.substring 0 7 src.rev}";' \
+ build/webpack.prod.conf.js
+ '';
+
+ configurePhase = ''
+ runHook preConfigure
+
+ export HOME="$(mktemp -d)"
+
+ yarn config --offline set yarn-offline-mirror ${offlineCache}
+ fixup-yarn-lock yarn.lock
+
+ yarn install --offline --frozen-lockfile --ignore-platform --ignore-scripts --no-progress --non-interactive
+
+ runHook postConfigure
+ '';
+})
diff --git a/pkgs/overlay.nix b/pkgs/overlay.nix
index 644d380..571bfe8 100644
--- a/pkgs/overlay.nix
+++ b/pkgs/overlay.nix
@@ -5,4 +5,5 @@ final: prev: {
build-worker-oci = final.callPackage ./build-worker-oci/default.nix {};
librespeed-rust = final.callPackage ./librespeed-rust/default.nix {};
librespeed-go = final.callPackage ./librespeed-go/default.nix {};
+ akkoma-fe-domi = final.callPackage ./akkoma-fe-domi/default.nix {};
}
diff --git a/secrets/services/akkoma.yaml b/secrets/services/akkoma.yaml
new file mode 100644
index 0000000..fc7bb2f
--- /dev/null
+++ b/secrets/services/akkoma.yaml
@@ -0,0 +1,35 @@
+services:
+ akkoma:
+ mailerPassword: ENC[AES256_GCM,data:kNep5V0HVr17bEIY2/AbwRUPqkfHKf9xnOnYi5sMJ+STWjVrQf+AzdueJTAf9Nym,iv:Usmu0uM5ev60Ui8h9zLUcDDJIHNSxAFtMq5LyLwmAsA=,tag:fNIhB8LGJwWO3zzQWgm68A==,type:str]
+ deepl: ENC[AES256_GCM,data:JVJkCm6UFUlownU/oRTmZ5o85mPv935Hj56JcXCt3PwNmx1kQbyj,iv:UzvGgVter1/9U8g/HQ2FfWNviD0KgWRLnW9fzgfGDag=,tag:q65bd26xFQ6Av71hy8u2fA==,type:str]
+sops:
+ kms: []
+ gcp_kms: []
+ azure_kv: []
+ hc_vault: []
+ age:
+ - recipient: age1ht2wetcyl9rzu45e02pqqwgmyfsfe6y6ygxyuxpfhnkdm62d3pqsg3uqvd
+ enc: |
+ -----BEGIN AGE ENCRYPTED FILE-----
+ YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZTi9Ha0tQRGE2L3BzclpW
+ NnduRVVRUnhkV1pEOXllZTA0bnN0NENESlM4Ck9jSTcxcjJIdThvUk9IM1FCOGNv
+ V1FNV2ZHbHlTaWNBL0VvSGxhSzlWSDgKLS0tIEFoWEozY0VSWVA0cVp5dkI4NHNH
+ RVQ3aDd0c1RDNWd2eGxiNURGRXVXS2sKTT4LpWSIb9hjrcdUWOhieUeUHop0pwoA
+ OfOv3y3dp7tYc5HRREN5jkVx29jb2lrml0ycu9ek58S8+bolfzN8yQ==
+ -----END AGE ENCRYPTED FILE-----
+ lastmodified: "2024-10-31T16:57:58Z"
+ mac: ENC[AES256_GCM,data:VJpsLBdnle6bP6ALxLS2eTOEbiHJbNc5D+pvsoJulI9VODtBk0p1VvJv9ilToxh4oiwctMmCKSO4R9NyuZUqoqwwlYtW6tFDITBA2eg/iu/uQjcuuKLC+fFGdtnTpZcShUyMds3qi8Z8Iegk2sSMLk5QXCE2QhMUQ50VN4TXF2c=,iv:rOF34iqckOJMAVm+3RDSdlrJh4hgnyiTut3SM1e0w0E=,tag:cMjMkKkN8UFWGQqQfWBUnA==,type:str]
+ pgp:
+ - created_at: "2024-10-31T16:40:38Z"
+ enc: |-
+ -----BEGIN PGP MESSAGE-----
+
+ hF4D1GtNSlou/HkSAQdAmS/QDuU40+HtiMoCa9byz80b6lGMd6cvqxYShifFxUgw
+ Bn34D6HB6z3nQxWanlOCkA2ud8GBUhEFlLjsQf29apfWuWxKpNv37Olou1/vGvNm
+ 0l4BIzFesU+aoIUi+Fp0GbJ1+ObzRvGZq1IULChsDgbbvDnHah7yvN5wKYwj6x7f
+ ZhPpm40+FLea1najiN6igUD6oUy8TSYnCgPODef4FeI0ZwFqF5MaucY8CNuWsugS
+ =1vZk
+ -----END PGP MESSAGE-----
+ fp: B04F01A7A98A13020C39B4A68AB7B773A214ACE5
+ unencrypted_suffix: _unencrypted
+ version: 3.9.1