- import Website from '$lib/website/Website.svelte';
+ import Website from '$lib/website/view/Website.svelte';
let { data } = $props();
diff --git a/src/routes/[[actor=actor]]/(pages)/edit/+page.svelte b/src/routes/[[actor=actor]]/(pages)/edit/+page.svelte
index e57bf319..5771973f 100644
--- a/src/routes/[[actor=actor]]/(pages)/edit/+page.svelte
+++ b/src/routes/[[actor=actor]]/(pages)/edit/+page.svelte
@@ -1,5 +1,5 @@
diff --git a/src/routes/[[actor=actor]]/(pages)/p/[[page]]/+page.svelte b/src/routes/[[actor=actor]]/(pages)/p/[[page]]/+page.svelte
index 0fe36281..7a315e4f 100644
--- a/src/routes/[[actor=actor]]/(pages)/p/[[page]]/+page.svelte
+++ b/src/routes/[[actor=actor]]/(pages)/p/[[page]]/+page.svelte
@@ -1,5 +1,5 @@
diff --git a/src/routes/[[actor=actor]]/(pages)/p/[[page]]/edit/+page.svelte b/src/routes/[[actor=actor]]/(pages)/p/[[page]]/edit/+page.svelte
index e57bf319..5771973f 100644
--- a/src/routes/[[actor=actor]]/(pages)/p/[[page]]/edit/+page.svelte
+++ b/src/routes/[[actor=actor]]/(pages)/p/[[page]]/edit/+page.svelte
@@ -1,5 +1,5 @@
diff --git a/src/routes/[[actor=actor]]/.well-known/site.standard.publication/+server.ts b/src/routes/[[actor=actor]]/.well-known/site.standard.publication/+server.ts
index b1d75ece..e1baf25a 100644
--- a/src/routes/[[actor=actor]]/.well-known/site.standard.publication/+server.ts
+++ b/src/routes/[[actor=actor]]/.well-known/site.standard.publication/+server.ts
@@ -1,9 +1,9 @@
-import { loadData } from '$lib/website/load';
-import { createCache } from '$lib/cache';
+import { loadData } from '$lib/website/data/load';
+import { createCache } from '$lib/helpers/cache';
import { env } from '$env/dynamic/private';
import { error } from '@sveltejs/kit';
import { text } from '@sveltejs/kit';
-import { getActor } from '$lib/actor.js';
+import { getActor } from '$lib/helpers/actor.js';
export async function GET({ params, platform, request }) {
const cache = createCache(platform);
diff --git a/src/routes/[[actor=actor]]/api/reindex/+server.ts b/src/routes/[[actor=actor]]/api/reindex/+server.ts
index 28a2b458..88ffa1ff 100644
--- a/src/routes/[[actor=actor]]/api/reindex/+server.ts
+++ b/src/routes/[[actor=actor]]/api/reindex/+server.ts
@@ -2,7 +2,7 @@ import { json } from '@sveltejs/kit';
import { contrail, ensureInit } from '$lib/contrail';
import { listRecords } from '$lib/atproto/methods';
import { collections } from '$lib/atproto/settings';
-import { getActor } from '$lib/actor';
+import { getActor } from '$lib/helpers/actor';
import type { Did } from '@atcute/lexicons';
import { dev } from '$app/environment';
diff --git a/src/routes/[[actor=actor]]/blog/+layout.server.ts b/src/routes/[[actor=actor]]/blog/+layout.server.ts
index 5a88b2b4..9406d13a 100644
--- a/src/routes/[[actor=actor]]/blog/+layout.server.ts
+++ b/src/routes/[[actor=actor]]/blog/+layout.server.ts
@@ -1,6 +1,6 @@
import { getRecord } from '$lib/atproto/methods.js';
import type { Did } from '@atcute/lexicons';
-import { getActor } from '$lib/actor.js';
+import { getActor } from '$lib/helpers/actor.js';
export async function load({ params, platform, request }) {
const did = await getActor({ request, paramActor: params.actor, platform });
diff --git a/src/routes/[[actor=actor]]/blog/+layout.svelte b/src/routes/[[actor=actor]]/blog/+layout.svelte
index ea1c6fce..618ff8aa 100644
--- a/src/routes/[[actor=actor]]/blog/+layout.svelte
+++ b/src/routes/[[actor=actor]]/blog/+layout.svelte
@@ -1,5 +1,5 @@
diff --git a/src/routes/[[actor=actor]]/blog/+page.server.ts b/src/routes/[[actor=actor]]/blog/+page.server.ts
index 838966b3..7adb2e65 100644
--- a/src/routes/[[actor=actor]]/blog/+page.server.ts
+++ b/src/routes/[[actor=actor]]/blog/+page.server.ts
@@ -1,8 +1,8 @@
import { error } from '@sveltejs/kit';
import { getBlentoOrBskyProfile, getRecord, listRecords, parseUri } from '$lib/atproto/methods.js';
-import { createCache, type CachedProfile } from '$lib/cache';
+import { createCache, type CachedProfile } from '$lib/helpers/cache';
import type { Did } from '@atcute/lexicons';
-import { getActor } from '$lib/actor.js';
+import { getActor } from '$lib/helpers/actor.js';
export async function load({ params, platform, request }) {
const cache = createCache(platform);
diff --git a/src/routes/[[actor=actor]]/blog/[rkey]/+page.server.ts b/src/routes/[[actor=actor]]/blog/[rkey]/+page.server.ts
index 9c3e6340..015fc94a 100644
--- a/src/routes/[[actor=actor]]/blog/[rkey]/+page.server.ts
+++ b/src/routes/[[actor=actor]]/blog/[rkey]/+page.server.ts
@@ -1,8 +1,8 @@
import { error } from '@sveltejs/kit';
import { getBlentoOrBskyProfile, getRecord, parseUri } from '$lib/atproto/methods.js';
-import { createCache, type CachedProfile } from '$lib/cache';
+import { createCache, type CachedProfile } from '$lib/helpers/cache';
import type { Did } from '@atcute/lexicons';
-import { getActor } from '$lib/actor';
+import { getActor } from '$lib/helpers/actor';
export async function load({ params, platform, request }) {
const { rkey } = params;
diff --git a/src/routes/[[actor=actor]]/blog/[rkey]/+page.svelte b/src/routes/[[actor=actor]]/blog/[rkey]/+page.svelte
index f73c50e0..ba054cc8 100644
--- a/src/routes/[[actor=actor]]/blog/[rkey]/+page.svelte
+++ b/src/routes/[[actor=actor]]/blog/[rkey]/+page.svelte
@@ -2,7 +2,7 @@
import { getCDNImageBlobUrl } from '$lib/atproto';
import { Avatar as FoxAvatar } from '@foxui/core';
import { marked } from 'marked';
- import { sanitize } from '$lib/sanitize';
+ import { sanitize } from '$lib/helpers/sanitize';
import { all, createLowlight } from 'lowlight';
const lowlight = createLowlight(all);
diff --git a/src/routes/[[actor=actor]]/event/r/[rkey]/+page.server.ts b/src/routes/[[actor=actor]]/event/r/[rkey]/+page.server.ts
index ac980c3f..e0744cd4 100644
--- a/src/routes/[[actor=actor]]/event/r/[rkey]/+page.server.ts
+++ b/src/routes/[[actor=actor]]/event/r/[rkey]/+page.server.ts
@@ -1,5 +1,5 @@
import { error } from '@sveltejs/kit';
-import { getActor } from '$lib/actor';
+import { getActor } from '$lib/helpers/actor';
import {
fetchAtmoEvent,
fetchAtmoEventAttendees,
diff --git a/src/routes/[[actor=actor]]/og-new.png/+server.ts b/src/routes/[[actor=actor]]/og-new.png/+server.ts
index c8bfaa5e..78bb3c3d 100644
--- a/src/routes/[[actor=actor]]/og-new.png/+server.ts
+++ b/src/routes/[[actor=actor]]/og-new.png/+server.ts
@@ -1,8 +1,8 @@
import { env } from '$env/dynamic/private';
import { env as publicEnv } from '$env/dynamic/public';
import { error, json } from '@sveltejs/kit';
-import { getActor } from '$lib/actor';
-import { createCache } from '$lib/cache';
+import { getActor } from '$lib/helpers/actor';
+import { createCache } from '$lib/helpers/cache';
export async function GET({ params, platform, request }) {
const actor = await getActor({
diff --git a/src/routes/api/activate-domain/+server.ts b/src/routes/api/activate-domain/+server.ts
index 25722d8a..b080a693 100644
--- a/src/routes/api/activate-domain/+server.ts
+++ b/src/routes/api/activate-domain/+server.ts
@@ -1,7 +1,7 @@
import { json } from '@sveltejs/kit';
import { isDid } from '@atcute/lexicons/syntax';
import { getRecord } from '$lib/atproto/methods';
-import { verifyDomainDns } from '$lib/dns';
+import { verifyDomainDns } from '$lib/helpers/dns';
import type { Did } from '@atcute/lexicons';
const EXPECTED_TARGET = 'blento-proxy.fly.dev';
diff --git a/src/routes/api/image-proxy/+server.ts b/src/routes/api/image-proxy/+server.ts
index 44c02254..3bc7e392 100644
--- a/src/routes/api/image-proxy/+server.ts
+++ b/src/routes/api/image-proxy/+server.ts
@@ -1,5 +1,5 @@
import { error } from '@sveltejs/kit';
-import { parseSafeUrl } from '$lib/ssrf';
+import { parseSafeUrl } from '$lib/helpers/ssrf';
export async function GET({ url, locals }) {
if (!locals.did) {
diff --git a/src/routes/api/links/+server.ts b/src/routes/api/links/+server.ts
index da65d4ea..f0cc50e2 100644
--- a/src/routes/api/links/+server.ts
+++ b/src/routes/api/links/+server.ts
@@ -1,6 +1,6 @@
import { json } from '@sveltejs/kit';
import { getLinkPreview } from 'link-preview-js';
-import { parseSafeUrl } from '$lib/ssrf';
+import { parseSafeUrl } from '$lib/helpers/ssrf';
export async function GET({ url, locals }) {
if (!locals.did) {
diff --git a/src/routes/api/verify-domain/+server.ts b/src/routes/api/verify-domain/+server.ts
index e8358d74..79469b09 100644
--- a/src/routes/api/verify-domain/+server.ts
+++ b/src/routes/api/verify-domain/+server.ts
@@ -1,5 +1,5 @@
import { json } from '@sveltejs/kit';
-import { verifyDomainDns } from '$lib/dns';
+import { verifyDomainDns } from '$lib/helpers/dns';
const EXPECTED_TARGET = 'blento-proxy.fly.dev';
diff --git a/src/routes/test-cards/+page.svelte b/src/routes/test-cards/+page.svelte
index c69d9911..e9eb86b4 100644
--- a/src/routes/test-cards/+page.svelte
+++ b/src/routes/test-cards/+page.svelte
@@ -1,5 +1,5 @@
+
+
+ {#if status === 'success'}
+
+
+
+ {successMessage}
+
+
+ {:else}
+
+
+ {title}
+
+ {#if description}
+
+ {description}
+
+ {/if}
+
+
+ {#if username}
+
+
+ {#if status === 'error'}
+
+ Something went wrong. Please try again.
+
+ {/if}
+ {:else}
+
+ Set your Buttondown username in card settings to enable signups.
+
+ {/if}
+ {/if}
+
diff --git a/src/lib/cards/social/ButtondownCard/ButtondownCardSettings.svelte b/src/lib/cards/social/ButtondownCard/ButtondownCardSettings.svelte
new file mode 100644
index 00000000..2c8ac0fc
--- /dev/null
+++ b/src/lib/cards/social/ButtondownCard/ButtondownCardSettings.svelte
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/cards/social/ButtondownCard/index.ts b/src/lib/cards/social/ButtondownCard/index.ts
new file mode 100644
index 00000000..e2fcecaf
--- /dev/null
+++ b/src/lib/cards/social/ButtondownCard/index.ts
@@ -0,0 +1,36 @@
+import type { CardDefinition } from '../../types';
+import ButtondownCard from './ButtondownCard.svelte';
+import ButtondownCardSettings from './ButtondownCardSettings.svelte';
+
+export const ButtondownCardDefinition: CardDefinition = {
+ type: 'buttondown',
+ contentComponent: ButtondownCard,
+ settingsComponent: ButtondownCardSettings,
+ createNew: (card) => {
+ card.cardData = {
+ title: 'Subscribe',
+ description: 'Get updates straight to your inbox.',
+ buttonText: 'Subscribe',
+ placeholder: 'you@example.com',
+ successMessage: 'Thanks! Check your inbox to confirm.'
+ };
+ card.w = 4;
+ card.h = 2;
+ card.mobileW = 8;
+ card.mobileH = 3;
+ },
+
+ defaultColor: 'base',
+ allowSetColor: true,
+ canHaveLabel: false,
+
+ minW: 3,
+ minH: 2,
+ maxW: 8,
+ maxH: 4,
+
+ name: 'Buttondown',
+ keywords: ['buttondown', 'newsletter', 'subscribe', 'mailing list', 'email', 'signup'],
+ groups: ['Social'],
+ icon: `
`
+};
From 093fc269e75809b3a810871a424098876526263e Mon Sep 17 00:00:00 2001
From: Florian <45694132+flo-bit@users.noreply.github.com>
Date: Sat, 30 May 2026 23:35:19 +0200
Subject: [PATCH 14/15] fix
---
src/lib/cards/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lib/cards/index.ts b/src/lib/cards/index.ts
index c7c8f32f..99e3e00b 100644
--- a/src/lib/cards/index.ts
+++ b/src/lib/cards/index.ts
@@ -136,7 +136,7 @@ export const AllCardDefinitions = [
KichCookingLogCardDefinition,
SecretImageCardDefinition,
RPGActorCardDefinition,
- ButtondownCardDefinition
+ ButtondownCardDefinition,
BufoStatusCardDefinition
] as const;
From dce5ac1d3475773c64c58555cd5e720b20751080 Mon Sep 17 00:00:00 2001
From: Florian <45694132+flo-bit@users.noreply.github.com>
Date: Sat, 30 May 2026 23:41:53 +0200
Subject: [PATCH 15/15] fix 2
---
src/lib/cards/social/BufoStatusCard/BufoStatusCard.svelte | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/lib/cards/social/BufoStatusCard/BufoStatusCard.svelte b/src/lib/cards/social/BufoStatusCard/BufoStatusCard.svelte
index 43cddbbf..c4ad5166 100644
--- a/src/lib/cards/social/BufoStatusCard/BufoStatusCard.svelte
+++ b/src/lib/cards/social/BufoStatusCard/BufoStatusCard.svelte
@@ -1,6 +1,10 @@