From 7ea4fd1252a6b02c1a07def3c81587b7ce94ae50 Mon Sep 17 00:00:00 2001 From: Anuj Ahooja Date: Wed, 4 Mar 2026 21:49:11 -0800 Subject: [PATCH] New augment blog post along with features that are required for it --- astro.config.ts | 10 +- package.json | 1 + pnpm-lock.yaml | 50 +++ public/assets/augment-logo.png | Bin 0 -> 23815 bytes src/components/widgets/sequoia-comments.js | 63 ++- src/components/widgets/sequoia-subscribe.js | 379 ++++++++++++++++++ src/config.ts | 3 +- src/content/about/about.md | 2 +- .../posts/augments-atmospheric-home.md | 56 +++ src/layouts/PostLayout.astro | 1 + src/styles/global.css | 4 + src/styles/post.css | 2 +- src/types/config.types.ts | 1 + 13 files changed, 556 insertions(+), 16 deletions(-) create mode 100644 public/assets/augment-logo.png create mode 100644 src/components/widgets/sequoia-subscribe.js create mode 100644 src/content/posts/augments-atmospheric-home.md diff --git a/astro.config.ts b/astro.config.ts index dbdfad6..3cb9e37 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -7,6 +7,7 @@ import remarkDirective from 'remark-directive' import rehypeKatex from 'rehype-katex' import remarkEmbeddedMedia from './src/plugins/remark-embedded-media.mjs' import remarkReadingTime from './src/plugins/remark-reading-time.mjs' +import remarkFlexibleMarkers from 'remark-flexible-markers'; import rehypeCleanup from './src/plugins/rehype-cleanup.mjs' import rehypeImageProcessor from './src/plugins/rehype-image-processor.mjs' import rehypeCopyCode from './src/plugins/rehype-copy-code.mjs' @@ -31,7 +32,14 @@ export default defineConfig({ theme: 'css-variables', wrap: false }, - remarkPlugins: [remarkMath, remarkDirective, remarkEmbeddedMedia, remarkReadingTime, remarkTOC], + remarkPlugins: [ + remarkMath, + remarkDirective, + remarkEmbeddedMedia, + remarkReadingTime, + remarkTOC, + () => (tree) => { console.log('remark running'); return tree; }, + remarkFlexibleMarkers], rehypePlugins: [ rehypeKatex, rehypeCleanup, diff --git a/package.json b/package.json index e4743e3..b1771c7 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "rehype-external-links": "^3.0.0", "rehype-katex": "^7.0.1", "remark-directive": "^4.0.0", + "remark-flexible-markers": "^1.3.3", "remark-math": "^6.0.0", "sanitize-html": "^2.17.1", "sharp": "^0.34.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a3ab8b..b355228 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,6 +59,9 @@ importers: remark-directive: specifier: ^4.0.0 version: 4.0.0 + remark-flexible-markers: + specifier: ^1.3.3 + version: 1.3.3(unified@11.0.5) remark-math: specifier: ^6.0.0 version: 6.0.0 @@ -3707,6 +3710,11 @@ packages: remark-directive@4.0.0: resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} + remark-flexible-markers@1.3.3: + resolution: {integrity: sha512-oIE2YjSXAa4e+lTbkkr1Bd157bxJtlliQciGuBHNJ3Fl9+4+bJWORATwWkBGK4bTsLSffR3UYUg7GUXiY3geXA==} + peerDependencies: + unified: ^11 + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -4129,9 +4137,21 @@ packages: unifont@0.7.4: resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} + unist-builder@4.0.0: + resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} + unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-find-all-after@5.0.0: + resolution: {integrity: sha512-nGmOYvTSdGcI4RvrUNfe0mOsqqbbJOtqCQsppsY9KZjmv3nwM3YRgNBwFPdZ8Y+iv9Z/2PDjR9u6u+uK62XTTg==} + + unist-util-find-all-before@5.0.0: + resolution: {integrity: sha512-zir6a7GsXfdn4YAWR4F3hLNKZjTjLBJurdyquysvmX38xbftS1+qwvEhutxxHLq0Pp1tW5V1TDiuj+qluuOnKw==} + + unist-util-find-between-all@1.1.6: + resolution: {integrity: sha512-KTlYGJMu3waM/UiDoyJ374VzIvRRfw5yO/DLuy2vkzTfjJ41HDgAO/Tukzga7imk9l3W688arso3kE+5b+IW6g==} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -8872,6 +8892,17 @@ snapshots: transitivePeerDependencies: - supports-color + remark-flexible-markers@1.3.3(unified@11.0.5): + dependencies: + '@types/mdast': 4.0.4 + unified: 11.0.5 + unist-builder: 4.0.0 + unist-util-find-after: 5.0.0 + unist-util-find-all-after: 5.0.0 + unist-util-find-all-before: 5.0.0 + unist-util-find-between-all: 1.1.6 + unist-util-visit: 5.1.0 + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -9391,11 +9422,30 @@ snapshots: ofetch: 1.5.1 ohash: 2.0.11 + unist-builder@4.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.1 + unist-util-find-all-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-find-all-before@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-find-between-all@1.1.6: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 diff --git a/public/assets/augment-logo.png b/public/assets/augment-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8be8917e14d94d8ecb812489639ddd42c197cd8a GIT binary patch literal 23815 zcmeAS@N?(olHy`uVBq!ia0y~yV3P)64kiW$hR(}#su>sHIW;5GqpB!1xXLdixhgx^GDY3qj?1RPsv@@_H?<^Dp&~aYuh^=>Rvm1v zRbH_bNLXLpj?1PfCCw_x#SN;YC?(BSJ)@+gz)D}gyu4hm+*mKaC|%#s($Z4jz)0W7 zNVg~@O}Dr*uOzWTH?LS(-HwY(0c?g#YH@N=WOrZ+`K3k4sp=3_a6_DnQWHy3Q|yckjLdWmjCBnSZ1kb#!=ylV zAZ&F>EJ?JhRx2#cFR@O^Plhn8Ae4)vyJtZ}YGiI@Bt$?5LX{S$7C~50g`tjaT2bPeVwad|W@4UblA>#z zXk@Bul45SCYiW{}rkj$OVxD4bWNdDplm<5iq6O6$wOaQ3lrmiBE_eQko$?9i=40(@;Ta zQ4TnLrX=g9=A`DP=9Pd_kRdb$r6gOGWR~QlLR30z_};CC?r2W$Idx1uPjkPBPca5CABEENK+vtKiL*3vnYTvh%Hj4 zPylBHTcpHqqmOPVR*yjZ7Ube)$7Q1rFXimG5ancQUW%=Hk-ELzG!fnV3=9l@sS%!O zzP=1v3=9k$3@nUN46FCn( zP1DYZJ>qJxVN*ND+?Z+VPH7n3?4{hU|{%k0X&q$z|de*0v@bkU{K(vxiSeCcF@QXLxR=E z3Y)UswK+LHAq|$r&yE~D+PRAFjw8f%4edrYHhYSnpSyG^X!~tlgSNQ!@tf0pGcz-* zs&*Za;3%@1e_q`RH0;R0aM_`-@Z-I`)vn8bM8?J4YvmT_VOuBCC;|0Ug@)SXlWChf z{XW*0mX>-?(-EA@iyb<38HzJ>>`Q2SSA7IgHpDJxbC zNFdSQ(uS3#<>lRd27&qc>tAqi#6bgZ#;u*j&t2SSy!i9;^CD%1ikCHZ^I!0QBQRsu z-MskSWpB4;Uw2{u$+|c0|55SyoO^pBO9WVyt-OrGnzNT|%iocHWwoE>;Ts-N?zM*; zcHdhb%^h=f0L5ub%hZ>6*G{SLgSaUxFf*h)6C^ zu=JcX>9@?v*lQ~UukS5)ec@c6+R@3u8M@)lg%=)c7yopNUw+;CqwJMd4?)9UH;z?#Hhc5Ursop51`=X=F%c0F83qzA=@V5v zU%hx?QU9+dI(l{x_m$UQKR-Vozcni~CufZk_m&8qty{OwlB$_FY0{+m^XJc+^((`F zf6>!ZOTDN6`u%&V?^FK87k`{FKChy#-p#j&=jisVhwp0EaB*=xdL&}U9z5at>$R&^ zWo2ba$;yUi&D@-R{@nTV=2E>~I=;>Bb6Q$j{`~pV)58>)U(z<(}WitksR@ z*M6Is);=Tm-X2SR{r4C9j6Od*8@)9vG%0D(qm>4aF9yzz$2XT&R3v9- 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 z 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®sLLlFyAG%M?)6n?&Ew+Mzihkn)Op!s-*1UK+%aE0DQ;NG^BD<`NC4b#~5f{`J>wAU>;F)^{S(lYD7hYuf4 zPF6pD?ARhU28MvjE+K{~FK=zl4h{~!sJ%(&bl#mEf$Og?4rgEp@SRu1+;Hj4xpUt< z{7!9p^X~5M;^N|q+6)XU)Lc0kygq+%ArOW8;-QDI@ObiT>%QP4rTGy^y z7q_QkZ3Y zV&ch@C-3eqclY<+T>Si8)!w=n7Z$!yWMD{{xrl|~?}D2-X0y+(Kkh%zrt-&!hmRgT z`u6sAa`@lrA3uKl{QUg;+uQZe|Nm?JbzAQ3K3Qus8ygvG9)^Z|5mkm4*6;7{pFeZv z%sF#<qA{Y=A=519hJfwE@U6Gs-nV#tdb<8n z{h#;Zzc4c~e6a)ty0MXwknO{8)7fY5TfBaIdpk(_-{0TYzy4xinBp49)NmD1?&wtj9-gYHx>;Io; zPMz{veO2qV^!d5g<)5FOJ>1S;|2mJEnR)O12Mi29<}G4jh%Ng2>udG*cdqL>%nS`b zzPPv;9AcWToD92`+|23g>vLPr@$Jpc%^yF0M3TAuGUx8D(#lH9Dvu@n@^)`-ZPl(~ zWnid3HG3!H0`IJ?QGp^CwVQZ(cwGD$7#6T#}6tT5Yq5s zxL|v{U%r2yz{?jG7tc1!?TTY$aNqCp-?%T5EO5XOx+eJzu^qW<%;+OK{oscC-giIQ7!8w|GXmwyou+U^i$4$J5o%Wt~$( F699^U5zhbs literal 0 HcmV?d00001 diff --git a/src/components/widgets/sequoia-comments.js b/src/components/widgets/sequoia-comments.js index 0e49491..64905b6 100644 --- a/src/components/widgets/sequoia-comments.js +++ b/src/components/widgets/sequoia-comments.js @@ -113,21 +113,34 @@ const styles = ` align-items: center; gap: 0.375rem; padding: 0.5rem 1rem; - background: var(--sequoia-accent-color, #2563eb); - color: #ffffff; border: none; - border-radius: var(--sequoia-border-radius, 8px); + border-radius: var(--sequoia-border-radius, 15px); font-size: 0.875rem; font-weight: 500; cursor: pointer; text-decoration: none; transition: background-color 0.15s ease; + margin-left:10px; +} + +.sequoia-reply-bluesky { + background: var(--sequoia-accent-color, #2563eb); + color: #ffffff; +} + +.sequoia-reply-blacksky { + background: var(--sequoia-accent-color, #6060E9); + color: #ffffff; } -.sequoia-reply-button:hover { +.sequoia-reply-bluesky:hover { background: color-mix(in srgb, var(--sequoia-accent-color, #2563eb) 85%, black); } +.sequoia-reply-blacksky:hover { + background: color-mix(in srgb, var(--sequoia-accent-color, #5252c3) 85%, black); +} + .sequoia-reply-button svg { width: 1rem; height: 1rem; @@ -547,6 +560,20 @@ function buildBskyAppUrl(postUri) { return `https://bsky.app/profile/${parsed.did}/post/${parsed.rkey}`; } +/** + * Build a Blacksky app URL for a post + * @param {string} postUri - AT Protocol URI for the post + * @returns {string} Blacksky app URL + */ +function buildBlackskyAppUrl(postUri) { + const parsed = parseAtUri(postUri); + if (!parsed) { + throw new Error(`Invalid post URI: ${postUri}`); + } + + return `https://blacksky.community/profile/${parsed.did}/post/${parsed.rkey}`; +} + /** * Type guard for ThreadViewPost * @param {any} post - Post to check @@ -563,6 +590,7 @@ function isThreadViewPost(post) { const BLUESKY_ICON = ``; +const BLACKSKY_ICON = ''; // ============================================================================ // Web Component @@ -660,6 +688,7 @@ class SequoiaComments extends BaseElement { } const postUrl = buildBskyAppUrl(document.bskyPostRef.uri); + const blackskyPostUrl = buildBlackskyAppUrl(document.bskyPostRef.uri); // Fetch the post thread const thread = await getPostThread(document.bskyPostRef.uri, this.depth); @@ -668,11 +697,13 @@ class SequoiaComments extends BaseElement { const replies = thread.replies?.filter(isThreadViewPost) ?? []; if (replies.length === 0) { this.state = { type: "empty", postUrl }; + this.state = { type: "empty", blackskyPostUrl }; this.render(); return; } this.state = { type: "loaded", thread, postUrl }; + this.state = { type: "loaded", thread, blackskyPostUrl }; this.render(); } catch (error) { const message = @@ -716,10 +747,14 @@ class SequoiaComments extends BaseElement { this.commentsContainer.innerHTML = `
No comments yet. Be the first to reply on Bluesky! @@ -746,10 +781,14 @@ class SequoiaComments extends BaseElement { this.commentsContainer.innerHTML = `

${commentCount} Comment${commentCount !== 1 ? "s" : ""}

- - ${BLUESKY_ICON} - Reply on Bluesky - +
${threadsHtml} diff --git a/src/components/widgets/sequoia-subscribe.js b/src/components/widgets/sequoia-subscribe.js new file mode 100644 index 0000000..fccaef6 --- /dev/null +++ b/src/components/widgets/sequoia-subscribe.js @@ -0,0 +1,379 @@ +/** + * Sequoia Subscribe - A Bluesky-powered subscribe component + * + * A self-contained Web Component that lets users subscribe to a publication + * via the AT Protocol by creating a site.standard.graph.subscription record. + * + * Usage: + * + * + * The component resolves the publication AT URI from the host site's + * /.well-known/site.standard.publication endpoint. + * + * Attributes: + * - publication-uri: Override the publication AT URI (optional) + * - callback-uri: Redirect URI after OAuth authentication (default: "https://sequoia.pub/subscribe") + * - label: Button label text (default: "Subscribe on Bluesky") + * - hide: Set to "auto" to hide if no publication URI is detected + * + * CSS Custom Properties: + * - --sequoia-fg-color: Text color (default: #1f2937) + * - --sequoia-bg-color: Background color (default: #ffffff) + * - --sequoia-border-color: Border color (default: #e5e7eb) + * - --sequoia-accent-color: Accent/button color (default: #2563eb) + * - --sequoia-secondary-color: Secondary text color (default: #6b7280) + * - --sequoia-border-radius: Border radius (default: 8px) + * + * Events: + * - sequoia-subscribed: Fired when the subscription is created successfully. + * detail: { publicationUri: string, recordUri: string } + * - sequoia-subscribe-error: Fired when the subscription fails. + * detail: { message: string } + */ + +// ============================================================================ +// Styles +// ============================================================================ + +const styles = ` +:host { + display: inline-block; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + color: var(--sequoia-fg-color, #1f2937); + line-height: 1.5; +} + +* { + box-sizing: border-box; +} + +.sequoia-subscribe-button { + display: inline-flex; + align-items: center; + gap: 0.375rem; + padding: 0.5rem 1rem; + background: var(--sequoia-accent-color, #2563eb); + color: #ffffff; + border: none; + border-radius: var(--sequoia-border-radius, 8px); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + text-decoration: none; + transition: background-color 0.15s ease; + font-family: inherit; +} + +.sequoia-subscribe-button:hover:not(:disabled) { + background: color-mix(in srgb, var(--sequoia-accent-color, #2563eb) 85%, black); +} + +.sequoia-subscribe-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.sequoia-subscribe-button svg { + width: 1rem; + height: 1rem; + flex-shrink: 0; +} + +.sequoia-subscribe-button--success { + background: #16a34a; +} + +.sequoia-subscribe-button--success:hover:not(:disabled) { + background: color-mix(in srgb, #16a34a 85%, black); +} + +.sequoia-loading-spinner { + display: inline-block; + width: 1rem; + height: 1rem; + border: 2px solid rgba(255, 255, 255, 0.4); + border-top-color: #ffffff; + border-radius: 50%; + animation: sequoia-spin 0.8s linear infinite; + flex-shrink: 0; +} + +@keyframes sequoia-spin { + to { transform: rotate(360deg); } +} + +.sequoia-error-message { + display: inline-block; + font-size: 0.8125rem; + color: #dc2626; + margin-top: 0.375rem; +} +`; + +// ============================================================================ +// Icons +// ============================================================================ + +const BLUESKY_ICON = ``; + +const CHECK_ICON = ` + +`; + +// ============================================================================ +// AT Protocol Functions +// ============================================================================ + +/** + * Fetch the publication AT URI from the host site's well-known endpoint. + * @param {string} [origin] - Origin to fetch from (defaults to current page origin) + * @returns {Promise} Publication AT URI + */ +async function fetchPublicationUri(origin) { + const base = origin ?? window.location.origin; + const url = `${base}/.well-known/site.standard.publication`; + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Could not fetch publication URI: ${response.status}`); + } + + // Accept either plain text (the AT URI itself) or JSON with a `uri` field. + const contentType = response.headers.get("content-type") ?? ""; + if (contentType.includes("application/json")) { + const data = await response.json(); + const uri = data?.uri ?? data?.atUri ?? data?.publication; + if (!uri) { + throw new Error("Publication response did not contain a URI"); + } + return uri; + } + + const text = (await response.text()).trim(); + if (!text.startsWith("at://")) { + throw new Error(`Unexpected publication URI format: ${text}`); + } + return text; +} + +// ============================================================================ +// Web Component +// ============================================================================ + +// SSR-safe base class - use HTMLElement in browser, empty class in Node.js +const BaseElement = typeof HTMLElement !== "undefined" ? HTMLElement : class {}; + +class SequoiaSubscribe extends BaseElement { + constructor() { + super(); + const shadow = this.attachShadow({ mode: "open" }); + + const styleTag = document.createElement("style"); + styleTag.innerText = styles; + shadow.appendChild(styleTag); + + const wrapper = document.createElement("div"); + shadow.appendChild(wrapper); + wrapper.part = "container"; + + this.wrapper = wrapper; + this.state = { type: "idle" }; + this.abortController = null; + this.render(); + } + + static get observedAttributes() { + return ["publication-uri", "callback-uri", "label", "hide"]; + } + + connectedCallback() { + // Pre-check publication availability so hide="auto" can take effect + if (!this.publicationUri) { + this.checkPublication(); + } + } + + disconnectedCallback() { + this.abortController?.abort(); + } + + attributeChangedCallback() { + // Reset to idle if attributes change after an error or success + if ( + this.state.type === "error" || + this.state.type === "subscribed" || + this.state.type === "no-publication" + ) { + this.state = { type: "idle" }; + } + this.render(); + } + + get publicationUri() { + return this.getAttribute("publication-uri") ?? null; + } + + get callbackUri() { + return this.getAttribute("callback-uri") ?? "https://sequoia.pub/subscribe"; + } + + get label() { + return this.getAttribute("label") ?? "Subscribe on Bluesky"; + } + + get hide() { + const hideAttr = this.getAttribute("hide"); + return hideAttr === "auto"; + } + + async checkPublication() { + this.abortController?.abort(); + this.abortController = new AbortController(); + + try { + await fetchPublicationUri(); + } catch { + this.state = { type: "no-publication" }; + this.render(); + } + } + + async handleClick() { + if (this.state.type === "loading" || this.state.type === "subscribed") { + return; + } + + this.state = { type: "loading" }; + this.render(); + + try { + const publicationUri = + this.publicationUri ?? (await fetchPublicationUri()); + + // POST to the callbackUri (e.g. https://sequoia.pub/subscribe). + // If the server reports the user isn't authenticated it returns a + // subscribeUrl for the full-page OAuth + subscription flow. + const response = await fetch(this.callbackUri, { + method: "POST", + headers: { "Content-Type": "application/json" }, + credentials: "include", + body: JSON.stringify({ publicationUri }), + }); + + const data = await response.json(); + + if (response.status === 401 && data.authenticated === false) { + // Redirect to the hosted subscribe page to complete OAuth + window.location.href = data.subscribeUrl; + return; + } + + if (!response.ok) { + throw new Error(data.error ?? `HTTP ${response.status}`); + } + + const { recordUri } = data; + this.state = { type: "subscribed", recordUri, publicationUri }; + this.render(); + + this.dispatchEvent( + new CustomEvent("sequoia-subscribed", { + bubbles: true, + composed: true, + detail: { publicationUri, recordUri }, + }), + ); + } catch (error) { + // Don't overwrite state if we already navigated away + if (this.state.type !== "loading") return; + + const message = + error instanceof Error ? error.message : "Failed to subscribe"; + this.state = { type: "error", message }; + this.render(); + + this.dispatchEvent( + new CustomEvent("sequoia-subscribe-error", { + bubbles: true, + composed: true, + detail: { message }, + }), + ); + } + } + + render() { + const { type } = this.state; + + if (type === "no-publication") { + if (this.hide) { + this.wrapper.innerHTML = ""; + this.wrapper.style.display = "none"; + } + return; + } + + const isLoading = type === "loading"; + const isSubscribed = type === "subscribed"; + + const icon = isLoading + ? `` + : isSubscribed + ? CHECK_ICON + : BLUESKY_ICON; + + const label = isSubscribed ? "Subscribed" : this.label; + const buttonClass = [ + "sequoia-subscribe-button", + isSubscribed ? "sequoia-subscribe-button--success" : "", + ] + .filter(Boolean) + .join(" "); + + const errorHtml = + type === "error" + ? `${escapeHtml(this.state.message)}` + : ""; + + this.wrapper.innerHTML = ` + + ${errorHtml} + `; + + if (type !== "subscribed") { + const btn = this.wrapper.querySelector("button"); + btn?.addEventListener("click", () => this.handleClick()); + } + } +} + +/** + * Escape HTML special characters (no DOM dependency for SSR). + * @param {string} text + * @returns {string} + */ +function escapeHtml(text) { + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); +} + +// Register the custom element +if (typeof customElements !== "undefined") { + customElements.define("sequoia-subscribe", SequoiaSubscribe); +} + +// Export for module usage +export { SequoiaSubscribe }; diff --git a/src/config.ts b/src/config.ts index 4a15d80..f9290ad 100644 --- a/src/config.ts +++ b/src/config.ts @@ -33,6 +33,7 @@ export const themeConfig: ThemeConfig = { toc: true, // Show table of contents (when there is enough page width) imageViewer: true, // Enable image viewer copyCode: true, // Enable copy button in code blocks - linkCard: true // Enable link card + linkCard: true, // Enable link card + markers: true // Enable highlights on post } } diff --git a/src/content/about/about.md b/src/content/about/about.md index d9f6705..930d471 100644 --- a/src/content/about/about.md +++ b/src/content/about/about.md @@ -6,4 +6,4 @@ Hi, I'm Anuj Ahooja. You may know me as @quillmatiq on the [Atmosphere](https:// augment is a space where I write essays about technology, mostly focused on the open social web and the human internet. -You can subscribe via [email](https://buttondown.com/augment), [rss](https://augment.ink/rss), [atproto](), or [activitypub](). \ No newline at end of file +You can subscribe via [email](https://buttondown.com/augment), [RSS](https://augment.ink/rss), [the Atmosphere](https://sequoia.pub/subscribe?publicationUri=at%3A%2F%2Fdid%3Aplc%3Axgvzy7ni6ig6ievcbls5jaxe%2Fsite.standard.publication%2F3mgfwckliwc2m), or (soon) ActivityPub. \ No newline at end of file diff --git a/src/content/posts/augments-atmospheric-home.md b/src/content/posts/augments-atmospheric-home.md new file mode 100644 index 0000000..2fc7766 --- /dev/null +++ b/src/content/posts/augments-atmospheric-home.md @@ -0,0 +1,56 @@ +--- +title: augment's Atmospheric Home +pubDate: 2026-03-10 +image: /assets/augment-logo.png +tags: + - at protocol + - atmosphere + - atproto + - bluesky + - open social web + - social media + - social web + - blacksky +--- +We made it! augment has officially moved over to a self-hosted site, and I'm so excited to tell you all about it. + +I've always wanted augment to be a space that I could write, but more importantly, I wanted to be a canvas where I could imagine what blogging can look like when it becomes a ==social space==. One where published posts don't just sit to be seen, but commented on, interacted with directly, and become a portal to spaces where it's being shared so you can discover more. + +I don't want it to be a place you arrive; I want it to be ==a place that can expand that takes you to other places==. + +### An Atmospheric Blog +In an essay I wrote recently, I spoke about an ["Everything Account"](https://augment.ink/the-everything-account) and how it lives in an ecosystem of services called the Atmosphere. While that focused on the end-user experience, one other component of the Atmosphere is that all the data created in it lives in an accessible space that anyone can pull from. + +This means I can publish things like blog posts into the Atmosphere, and then I can keep track of different services people are using to interact with them. +* I can look at posts and comments being created on microblogs like [Bluesky](https://bsky.app) and [Blacksky](https://blacksky.community) and have them at the end of blog posts so you can engage with them +* I can peek at collections it's being added to on services like [semble.so](https://semble.so) and show them here so you can see what else those collections contain, and follow them if you want to +* I can display annotations that are being added to it on [margin.at](https://margin.at) and [seams.so](https://seams.so) and add them alongside this post so you can find insightful readers and follow them for more +* I can link macroblogs on [Leaflet](https://leaflet.pub), [pckt](pckt.blog), [Offprint](https://offprint.app/), and [GreenGale](https://greengale.app/) that mention my blog posts or my posts in different reading experiences like [Skyreader](https://skyreader.app/) + +Over time, as the Atmosphere grows with more services, I can entangle this blog with them. I can make this a living, breathing website that grows with everyone who interacts with it across the open social web. + +To begin this work, I'm starting with having every essay I write here publish to the Atmosphere using [standard.site](https://standard.site/). This makes all of my posts native to the ecosystem, allows readers to subscribe using their Atmosphere account, and lets the them find it on macroblogging services across the Atmosphere. You'll also see comments below this based on who's replying to my microblog announcing the post on apps like Bluesky and Blacksky. Right now, you have to go to a platform to reply; eventually, I want readers to be able to reply directly below the blog post using their Atmosphere account. More on that soon. + +The exciting part about this is that we're also adding standard.site into [Bridgy Fed](https://fed.brid.gy/). This means they'll soon show up on ActivityPub-based services like [Mastodon](https://joinmastodon.org/), [WordPress](https://wordpress.org/), [Ghost](http://ghost.org/), [NodeBB](https://nodebb.org/), and so many more, and I can pull bridged comments from that ecosystem onto this site as well. + +==augment is an Atmospheric blog that's tapping into the wider open social web==, and it's only just the starting point. We can go so much deeper, and I'm looking forward to experimenting with how deep we can go. + +### An Open Foundation +But this didn't come from scratch. The new augment lives on the work of multiple projects, and I want to take a moment to call those out. +* The site is forked from [Chiri](https://github.com/the3ash/astro-chiri/), an Astro theme that I ever-so-slightly customized to my needs +* The newsletter is now distributed via [Buttondown](http://buttondown.com/), an email service that simply takes my RSS feed updates and sends them to your inbox +* [standard.site](https://standard.site) is a longform standard built by the Atmosphere longform community, kicked off by Offprint, Leaflet, and pckt +* The standard.site integration is setup using [Sequoia](https://sequoia.pub/), a CLI tool that enables subcriptions, sends the blog post and a microblog to the Atmosphere when it's published, and brings microblog comments back to this page so other readers can see it + +None of this could've been possible without the hard work of the people behind these projects. + +I'm also open sourcing this blog on [GitHub](https://github.com/quillmatiq/augment) and [Tangled](https://tangled.org/quillmatiq.com/augment), a GitHub competitor built on atproto where I'll eventually host the repo myself. That means that as I add new features and make it more Atmospheric, you'll be able to see how I've done it, and can either use that code or use it as inspiration to do the same. + +### Wherever You Read Your Blogs +You've probably heard the words ["wherever you get your podcasts"](https://www.anildash.com/2024/02/05/wherever-you-get-podcasts/) a lot. It's [a common starting point](https://knotbin.leaflet.pub/3lx3uqveyj22f) for folks to understand open standards. + +Well, starting today, you can read augment wherever you read your blogs: your [email inbox](https://buttondown.com/augment), your [RSS reader](https://augment.ink/rss), the [Atmosphere](https://sequoia.pub/subscribe?publicationUri=at%3A%2F%2Fdid%3Aplc%3Axgvzy7ni6ig6ievcbls5jaxe%2Fsite.standard.publication%2F3mgfwckliwc2m), and (soon) the Fediverse. + +Subscribe where you want to read it. And hopefully, over time, I'll make it worth you while to come here, because it'll have so much more than just my ramblings. + +Welcome to the new Atmospheric home of augment. I'm so excited to show you more. \ No newline at end of file diff --git a/src/layouts/PostLayout.astro b/src/layouts/PostLayout.astro index 1f3f0ca..9fce407 100644 --- a/src/layouts/PostLayout.astro +++ b/src/layouts/PostLayout.astro @@ -55,6 +55,7 @@ const backupImage = `/open-graph/${postSlug}.png`
+

Comments

diff --git a/src/styles/global.css b/src/styles/global.css index a9b236f..e73c096 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -205,3 +205,7 @@ main { clip-path: inset(50%); white-space: nowrap; } + +mark { + background-color: #fef08a; +} \ No newline at end of file diff --git a/src/styles/post.css b/src/styles/post.css index 1915947..4dee41f 100644 --- a/src/styles/post.css +++ b/src/styles/post.css @@ -579,4 +579,4 @@ /* Spotify */ .prose iframe[src*='spotify.com'] { aspect-ratio: auto; -} +} \ No newline at end of file diff --git a/src/types/config.types.ts b/src/types/config.types.ts index 201bc4a..1b714ea 100644 --- a/src/types/config.types.ts +++ b/src/types/config.types.ts @@ -34,6 +34,7 @@ export interface PostSettings { imageViewer: boolean copyCode: boolean linkCard: boolean + markers: boolean } // Theme configuration type -- 2.51.2