{{ define "title" }}tangled · tightly-knit social coding{{ end }} {{ define "extrameta" }} {{ end }} {{ define "content" }}
{{ template "timeline/fragments/hero" . }} {{ template "timeline/fragments/preview" . }} {{ template "features1" . }} {{ template "features2" . }} {{ template "recentUpdates" . }} {{ template "community" . }}
{{ end }} {{ block "topbarLayout" . }}
{{ if .LoggedInUser }}
{{ end }} {{ template "layouts/fragments/topbar" . }}
{{ end }} {{ block "footerLayout" . }} {{ end }} {{ block "bodyClasses" . }} bg-transparent bg-gradient-to-b from-white to-slate-100 dark:bg-none dark:bg-gray-900 {{ end }} {{ block "mainLayout" . }}
{{ block "contentLayout" . }}
{{ block "content" . }}{{ end }}
{{ end }} {{ block "contentAfterLayout" . }}
{{ block "contentAfter" . }}{{ end }}
{{ end }}
{{ end }} {{ define "features1" }} {{ $labelStyle := "normal-case cursor-pointer w-auto md:w-full p-4 md:px-6 rounded bg-white dark:bg-gray-800 font-medium text-base md:text-lg opacity-50 border border-gray-200 dark:border-gray-700 relative overflow-hidden" }} {{ $spanStyle := "z-10 items-center justify-between gap-2 w-full" }} {{ $connectorStyle := "w-0.5 h-6 bg-gray-300 dark:bg-gray-600 opacity-0 mx-auto" }} {{ $contentStyle := "hidden bg-white dark:bg-gray-800 rounded shadow-sm p-6 border border-gray-200 dark:border-gray-700 grid-cols-1 md:grid-cols-2" }} {{ $progressOverlayStyle := "absolute inset-0 bg-gray-600/10 dark:bg-gray-100/10 w-0 transition-none" }}
{{ $titleStyle := "text-xl md:text-2xl font-bold my-2 text-gray-900 dark:text-gray-100" }} {{ $textContentStyle := "pb-6 md:p-6 md:pr-12 md:text-lg" }} {{ $imgContentStyle := "w-full p-6 min-h-96 min-h-[400px] md:min-h-[500px] rounded overflow-hidden place-content-center bg-gradient-to-b from-slate-50 to-slate-100 dark:from-gray-800 dark:to-gray-900 border border-gray-200 dark:border-gray-700" }}

Stacked PRs

Break down large features into small, reviewable chunks. Stack pull requests on top of each other and ship faster with better code reviews. Tangled natively supports stacking using Jujutsu Change-Ids.

Round-based review

Pull-requests in Tangled are round-based, which means, each submission is "immutable". To update a PR, the author must start a second revision or "round". As a reviewer, you never have to worry about a PR changing during a review!

{{ $mockPRs := list (dict "Id" 941 "Title" "spindle/nixery: update setup command docs" "State" "open" ) (dict "Id" 940 "Title" "appview/pulls: fix search not updating count of pull requests" "State" "open" ) (dict "Id" 939 "Title" "appview/pages: improved seo tags for home, repo and profile" "State" "open" ) (dict "Id" 938 "Title" "appview/state: update robots.txt" "State" "merged" ) (dict "Id" 937 "Title" "appview/profile: show dummy profile when no tangled profile" "State" "merged" ) (dict "Id" 936 "Title" "appview/pipelines: fix incorrect totals" "State" "merged" ) }} {{ range $index, $pr := $mockPRs }} {{ $scale := 1.4 }} {{ if gt $index 0 }} {{ $scale = subf64 1.4 (mulf64 (f64 $index) 0.04) }} {{ if lt $scale 1.0 }}{{ $scale = 1.0 }}{{ end }} {{ end }} {{ $zIndex := sub 100 $index }} {{ template "mockPRRow" (dict "PR" $pr "Scale" $scale "ZIndex" $zIndex) }} {{ end }}

Knots

Host your repositories on your own infrastructure with knots. Knots are lightweight git repository hosts that syndicate git operations across the network. You can setup a knot server on a machine as small as a Raspberry Pi!

If you want to try Tangled without self-hosting, fear not! All users are added to our hosted knot by default.

Spindles

Host CI runners on your own infrastructure with spindles. Spindles are responsible for queuing up CI jobs and syndicating pipeline statuses to the network. Presently, the task of sandboxing workflows and caching dependencies is delegated to Docker.

{{ $planetWrapperStyle := "absolute left-1/2 bottom-0 flex items-start justify-center -translate-x-1/2 translate-y-1/2" }} {{ $orbitStyle := "absolute left-1/2 bottom-0 rounded-full border-2 border-gray-200 dark:border-gray-700 -translate-x-1/2 translate-y-1/2 shadow-lg" }} {{ $planetStyle := "-mt-8 size-16 md:-mt-10 md:size-20 rounded-full shadow-sm border flex items-center justify-center" }}
{{ i "server" "size-8" "text-blue-500" "dark:text-blue-500" }}
{{ i "hard-drive" "size-8" "text-green-500" "dark:text-green-500" }}
{{ i "server" "size-8" "text-amber-500" "dark:text-amber-500" }}
{{ i "server" "size-8" "text-blue-500" "dark:text-blue-500" }}
{{ i "router" "size-8" "text-green-500" "dark:text-green-500" }}
{{ i "database" "size-8" "text-amber-500" "dark:text-amber-500" }}

Nix-powered CI

Pick and choose dependencies for your CI pipelines from nixpkgs, one of the biggest package repositories.

All dependencies and workflow images are cached using nixery. Subsuquent runs of your CI pipeline will load all dependencies almost instantly.

Customizable Engines

coming soon

We know nix is not for everybody! Spindles are built to have swappable engines, on our roadmap are Docker and Firecracker based engines.

.tangled/workflows/test.yml
{{ $yamlContent := `when: - event: push branch: main dependencies: nixpkgs: - go - gcc environment: CGO_ENABLED: 1 steps: - name: run all tests command: go test -v ./...` }}
{{ code $yamlContent ".tangled/workflows/test.yml" | escapeHtml }}
{{ end }} {{ define "mockPRRow" }} {{ $pr := .PR }}
{{ if eq $pr.State "open" }} {{ i "git-pull-request" "size-4 text-green-500" }} {{ else }} {{ i "git-merge" "size-4 text-purple-500" }} {{ end }}
#{{ $pr.Id }} {{ $pr.Title }}
{{ end }} {{ define "features2" }} {{ $cardStyle := "bg-white dark:bg-gray-800 rounded shadow-sm border border-gray-200 dark:border-gray-700" }} {{ $cardInnerStyle := "flex flex-row items-center gap-4 md:gap-6 p-4 md:p-6 md:pt-8 relative" }} {{ $contentStyle := "flex-1 flex flex-col" }} {{ $titleStyle := "text-xl md:text-2xl font-bold mb-2 md:mb-3 text-gray-900 dark:text-gray-100" }} {{ $descriptionStyle := "text-gray-600 dark:text-gray-300 text-sm md:text-base leading-relaxed mb-3 md:mb-0" }} {{ $linkMobileStyle := "hover:no-underline inline-flex md:hidden items-center gap-2 text-sm text-gray-700 dark:text-gray-300 font-medium" }} {{ $iconContainerStyle := "relative shrink-0 w-24 h-24 md:w-48 md:h-48" }} {{ $iconCircleStyle := "w-full h-full rounded-full flex items-center justify-center" }} {{ $linkDesktopStyle := "hover:no-underline hidden md:inline-flex absolute -bottom-10 -right-14 items-center gap-2 p-3 text-base btn" }}

Built on AT Protocol

AT Protocol enables federated code-collaboration. Submit pull-requests or bug-reports to any repository hosted on any server.

Bring an existing AT Protocol account (such as your Bluesky account), or signup for one with us. Read the docs to know more.

Learn more {{ i "arrow-right" "size-4" }}
{{ i "at-sign" "size-12 md:size-24" "text-blue-500 dark:text-blue-500" "rotate-12" }}
Learn more {{ i "arrow-right" "size-4" }}

Free and Open-source

All of Tangled is open-source and built in the open! Check out the monorepo and join in on the fun.

We welcome contributions however big or small. You can start contributing by picking up a good-first-issue.

Learn more {{ i "arrow-right" "size-4" }}
{{ i "package-open" "size-12 md:size-24" "text-green-500 dark:text-green-500" "-rotate-12" }}
Learn more {{ i "arrow-right" "size-4" }}

Social coding is back

Discover trending projects, follow your friends and star your favourite repositories. Coding is better together!

You can use one account for all of the atmosphere. If you have friends on Bluesky, you will find them on Tangled with the same handle.

Learn more {{ i "arrow-right" "size-4" }}
{{ i "message-circle-heart" "size-12 md:size-24" "text-amber-500 dark:text-amber-500" "rotate-12" }}
Learn more {{ i "arrow-right" "size-4" }}
{{ end }} {{ define "changelog" }}

Changelog

{{ range $index := list 0 1 2 3 }}
v1.{{ sub 3 $index }}.0 Feb {{ sub 16 $index }}, 2026

Feature Update {{ sub 4 $index }}

Improvements to the platform including bug fixes, performance enhancements, and new features.

{{ end }}
View full changelog {{ i "arrow-right" "size-4" }}
{{ end }} {{ define "recentUpdates" }}

Recent updates

Follow @tangled.org on Bluesky for more!

{{ range $index, $post := .BlueskyPosts }}
{{ template "post" $post }}
{{ end }}
{{ end }} {{ define "post" }}
{{ template "user/fragments/picHandle" "tangled.org" }} {{ template "repo/fragments/shortTimeAgo" .CreatedAt }}

{{ .Text }}

{{ if .Embed }} {{ if .Embed.EmbedImages_View }}
{{ range .Embed.EmbedImages_View.Images }} {{ .Alt }} {{ end }}
{{ else if .Embed.EmbedExternal_View }} {{ if .Embed.EmbedExternal_View.External.Thumb }} {{ end }}
{{ .Embed.EmbedExternal_View.External.Title }}
{{ .Embed.EmbedExternal_View.External.Description }}
{{ .Embed.EmbedExternal_View.External.Uri }}
{{ else if .Embed.EmbedVideo_View }}
Video embed
{{ end }} {{ end }}
{{ i "heart" "size-4" }} {{ .LikeCount }}
{{ i "repeat-2" "size-4" }} {{ .RepostCount }}
{{ i "reply" "size-4 -scale-x-1" }} {{ add64 .ReplyCount .QuoteCount }}
{{ i "arrow-up-right" "size-4" }}
{{ end }} {{ define "community" }}

Join the network

You can participate in the Tangled network with an AT account. If you don't know what that is, you can sign up for one below.
Read more on the docs.

{{ end }}