Monorepo for Tangled tangled.org
2

Configure Feed

Select the types of activity you want to include in your feed.

blog: the great uppercasing

author
Anirudh Oppiliappan
committer
Tangled
date (Jun 8, 2026, 3:11 PM +0300) commit d03bcb23 parent 46ae42ce change-id wuzqnvop
+42 -42
+1 -1
blog/blog.go
··· 115 115 116 116 func AtomFeed(posts []Post, baseURL string) (string, error) { 117 117 feed := &feeds.Feed{ 118 - Title: "the tangled blog", 118 + Title: "The Tangled Blog", 119 119 Link: &feeds.Link{Href: baseURL}, 120 120 Author: &feeds.Author{Name: "Tangled"}, 121 121 Created: time.Now(),
+1 -1
blog/posts/6-months.md
··· 3 3 template: 4 4 slug: 6-months 5 5 title: 6 months of Tangled 6 - subtitle: a quick recap, and notes on the future 6 + subtitle: A quick recap, and notes on the future 7 7 date: 2025-10-21 8 8 image: https://assets.tangled.network/blog/6-months.png 9 9 authors:
+3 -3
blog/posts/ci.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: ci 5 - title: introducing spindle 6 - subtitle: tangled's new CI runner is now generally available 5 + title: Introducing spindle 6 + subtitle: Tangled's new CI runner is now generally available 7 7 date: 2025-08-06 8 8 authors: 9 9 - name: Anirudh ··· 176 176 177 177 ## pipeline secrets 178 178 179 - Secrets are a bit tricky since atproto has no notion of 179 + Secrets are a bit tricky since AT Protocol has no notion of 180 180 private data. Secrets are instead written directly from the 181 181 appview to the spindle instance using [service 182 182 auth](https://docs.bsky.app/docs/api/com-atproto-server-get-service-auth).
+3 -3
blog/posts/docs.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: docs 5 - title: we rolled our own documentation site 6 - subtitle: you don't need mintlify 5 + title: We rolled our own documentation site 6 + subtitle: You don't need Mintlify 7 7 date: 2026-01-12 8 8 authors: 9 9 - name: Akshay ··· 39 39 solutions: 40 40 41 41 - [Mintlify](https://www.mintlify.com/): It is quite obvious 42 - from their homepage that mintlify is performing an AI 42 + from their homepage that Mintlify is performing an AI 43 43 pivot for the sake of doing so. 44 44 - [Docusaurus](https://docusaurus.io/): The generated 45 45 documentation site is quite nice, but the value of pages
+3 -3
blog/posts/federation.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: federation 5 - title: we need a federation of forges 6 - subtitle: git is decentralized, but what of the rest? 5 + title: We need a federation of forges 6 + subtitle: Git is decentralized, but what of the rest? 7 7 image: https://assets.tangled.network/blog/federation/Light-OG.png 8 8 date: 2026-04-29 9 9 authors: ··· 36 36 ActivityPub](https://forgefed.org/blog/actor-programming/) 37 37 (comms) 38 38 - We are building Tangled: git (code transfer) + [AT 39 - protocol](https://atproto.com/) (comms) 39 + Protocol](https://atproto.com/) (comms) 40 40 41 41 Tangled federates events among git servers (called "knots"). 42 42 You can collaborate on repositories on any server and you
+4 -4
blog/posts/intro.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: intro 5 - title: introducing tangled 6 - subtitle: a git collaboration platform, built on atproto 5 + title: Introducing Tangled 6 + subtitle: A git collaboration platform, built on AT Protocol 7 7 date: 2025-03-02 8 8 authors: 9 9 - name: Anirudh ··· 21 21 There are several models for decentralized code collaboration platforms, 22 22 ranging from ActivityPub's (Forgejo) federated model, to Radicle's 23 23 entirely P2P model. Our approach attempts to be the best of both worlds 24 - by adopting atproto -- a protocol for building decentralized social 24 + by adopting AT Protocol -- a protocol for building decentralized social 25 25 applications with a central identity. 26 26 27 27 ![tangled architecture](https://assets.tangled.network/blog/arch.svg) ··· 51 51 enables common workflows to work as you'd expect, all while remaining 52 52 decentralized. 53 53 54 - We believe that atproto has greatly simplified one of the hardest parts 54 + We believe that AT Protocol has greatly simplified one of the hardest parts 55 55 of social media: having your friends on it. Today, we're rolling out 56 56 invite-only access to Tangled -- join us on IRC at `#tangled` on 57 57 [libera.chat](https://libera.chat) and we'll get you set up.
+2 -2
blog/posts/newsletter-01.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: newsletter-01 5 - title: newsletter 01 — hello! 6 - subtitle: kicking off our newsletter! 5 + title: Newsletter 01 — Hello! 6 + subtitle: Kicking off our newsletter! 7 7 image: https://assets.tangled.network/blog/newsletter-01.png 8 8 date: 2026-04-16 9 9 authors:
+2 -2
blog/posts/pty.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: ssh 5 - title: tail CI logs over SSH 6 - subtitle: never leave your terminal to check on CI! 5 + title: Tail CI logs over SSH 6 + subtitle: Never leave your terminal to check on CI! 7 7 image: https://assets.tangled.network/blog/pty/astral-projection.webp 8 8 date: 2026-05-28 9 9 authors:
+3 -3
blog/posts/pulls.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: pulls 5 - title: the lifecycle of a pull request 6 - subtitle: we shipped a bunch of PR features recently; here's how we built it 5 + title: The lifecycle of a pull request 6 + subtitle: We shipped a bunch of PR features recently; here's how we built it 7 7 date: 2025-04-16 8 8 image: https://assets.tangled.network/blog/hidden-ref.png 9 9 authors: ··· 117 117 118 118 And just like earlier, we produce the patch by diffing your 119 119 feature branch with the hidden tracking ref. Also, the entire pull 120 - request is stored as [an atproto record][atproto-record] and updated 120 + request is stored as [an AT Protocol record][atproto-record] and updated 121 121 each time the patch changes. 122 122 123 123 [atproto-record]: https://pdsls.dev/at://did:plc:qfpnj4og54vl56wngdriaxug/sh.tangled.repo.pull/3lmwniim2i722
+2 -2
blog/posts/seed.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: seed 5 - title: announcing our €3,8M seed round 6 - subtitle: and more on what's next 5 + title: Announcing our €3,8M seed round 6 + subtitle: And more on what's next 7 7 date: 2026-03-02 8 8 image: https://assets.tangled.network/blog/seed.png 9 9 authors:
+2 -2
blog/posts/stacking.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: stacking 5 - title: jujutsu on tangled 6 - subtitle: tangled now supports jujutsu change-ids! 5 + title: Jujutsu on Tangled 6 + subtitle: Tangled now supports jujutsu change-ids! 7 7 date: 2025-06-02 8 8 image: https://assets.tangled.network/blog/interdiff_difference.jpeg 9 9 authors:
+2 -2
blog/posts/vouching.md
··· 2 2 atroot: true 3 3 template: 4 4 slug: vouching 5 - title: combat LLM spam by building a web of trust 6 - subtitle: vouching on tangled! 5 + title: Combat LLM spam by building a web of trust 6 + subtitle: Vouching on Tangled! 7 7 image: https://assets.tangled.network/vouch.png 8 8 date: 2026-05-01 9 9 authors:
+6 -6
blog/templates/fragments/footer.html
··· 7 7 </a> 8 8 <span>&copy; 2026 Tangled Labs Oy.</span> 9 9 </div> 10 - <a href="https://docs.tangled.org" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline">docs</a> 11 - <a href="https://tangled.org/tangled.org/core" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline">source</a> 12 - <a href="https://chat.tangled.org" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline" target="_blank" rel="noopener noreferrer">discord</a> 13 - <a href="https://bsky.app/profile/tangled.org" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline" target="_blank" rel="noopener noreferrer">bluesky</a> 14 - <a href="https://x.com/tangled_org" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline" target="_blank" rel="noopener noreferrer">twitter (x)</a> 15 - <a href="/feed.xml" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline">feed</a> 10 + <a href="https://docs.tangled.org" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline">Docs</a> 11 + <a href="https://tangled.org/tangled.org/core" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline">Source</a> 12 + <a href="https://chat.tangled.org" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline" target="_blank" rel="noopener noreferrer">Discord</a> 13 + <a href="https://bsky.app/profile/tangled.org" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline" target="_blank" rel="noopener noreferrer">Bluesky</a> 14 + <a href="https://x.com/tangled_org" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline" target="_blank" rel="noopener noreferrer">Twitter (X)</a> 15 + <a href="/feed.xml" class="hover:text-gray-900 dark:hover:text-gray-200 hover:underline">Feed</a> 16 16 </div> 17 17 </footer> 18 18 {{ end }}
+2 -2
blog/templates/fragments/topbar.html
··· 9 9 </div> 10 10 11 11 <div id="right-items" class="flex items-center gap-4"> 12 - <a href="https://tangled.org/login">login</a> 12 + <a href="https://tangled.org/login">Login</a> 13 13 <span class="text-gray-500 dark:text-gray-400">or</span> 14 14 <a href="https://tangled.org/signup" class="btn-create py-0 hover:no-underline hover:text-white flex items-center gap-2"> 15 - join now {{ i "arrow-right" "size-4" }} 15 + Join now {{ i "arrow-right" "size-4" }} 16 16 </a> 17 17 </div> 18 18 </div>
+4 -4
blog/templates/index.html
··· 1 - {{ define "title" }}the tangled blog{{ end }} 1 + {{ define "title" }}The Tangled Blog{{ end }} 2 2 3 3 {{ define "extrameta" }} 4 - <meta name="description" content="The Tangled blog." /> 4 + <meta name="description" content="The Tangled Blog" /> 5 5 <link rel="alternate" type="application/atom+xml" title="Atom" href="/feed.xml" /> 6 6 {{ end }} 7 7 ··· 16 16 <div class="max-w-screen-lg mx-auto w-full px-4 py-10"> 17 17 18 18 <header class="mb-10 text-center"> 19 - <h1 class="text-3xl font-bold dark:text-white mb-2">the tangled blog</h1> 20 - <p class="text-gray-500 dark:text-gray-400">all the ropes and scaffolding</p> 19 + <h1 class="text-3xl font-bold dark:text-white mb-2">The Tangled Blog</h1> 20 + <h2 class="text-lg text-gray-500 dark:text-gray-400">All the ropes and scaffolding.</h2> 21 21 </header> 22 22 23 23 {{ if .Featured }}
+2 -2
blog/templates/post.html
··· 1 - {{ define "title" }}{{ .Post.Meta.Title }} — tangled blog{{ end }} 1 + {{ define "title" }}{{ .Post.Meta.Title }} — Tangled's Blog{{ end }} 2 2 3 3 {{ define "extrameta" }} 4 4 <meta name="description" content="{{ .Post.Meta.Subtitle }}"/> ··· 32 32 <header class="not-prose mb-4"> 33 33 {{ $authors := .Post.Meta.Authors }} 34 34 <div class="flex items-center gap-2 mb-1 text-sm text-gray-600 dark:text-gray-400"> 35 - <a href="/" class="flex items-center gap-1 text-gray-600 dark:text-gray-400">{{ i "arrow-left" "size-4" }} all posts</a> 35 + <a href="/" class="flex items-center gap-1 text-gray-600 dark:text-gray-400">{{ i "arrow-left" "size-4" }} All posts</a> 36 36 · 37 37 <p> 38 38 {{ $date := .Post.ParsedDate }}