import React from "react"; import { useStore } from "@nanostores/react"; import { Link } from "react-router-dom"; import { $theme, cycleTheme } from "../store/theme"; import { $user } from "../store/auth"; import { MessageSquareText, Highlighter, Bookmark, FolderOpen, Keyboard, PanelRight, MousePointerClick, Shield, Users, Chrome, ArrowRight, Github, ExternalLink, Hash, Heart, Coffee, Globe, Eye, Sun, Moon, Monitor, } from "lucide-react"; import { AppleIcon, TangledIcon } from "../components/common/Icons"; import { FaFirefox, FaEdge } from "react-icons/fa"; function FeatureCard({ icon: Icon, title, description, accent = false, }: { icon: React.ElementType; title: string; description: string; accent?: boolean; }) { return (

{title}

{description}

); } function ExtensionFeature({ icon: Icon, title, description, }: { icon: React.ElementType; title: string; description: string; }) { return (

{title}

{description}

); } export default function About() { const theme = useStore($theme); // ensure theme is applied on this page const user = useStore($user); const [browser] = React.useState< "chrome" | "firefox" | "edge" | "safari" | "other" >(() => { if (typeof navigator === "undefined") return "other"; const ua = navigator.userAgent; if (/Edg\//i.test(ua)) return "edge"; if (/Firefox/i.test(ua)) return "firefox"; if (/^((?!chrome|android).)*safari/i.test(ua)) return "safari"; if (/Chrome/i.test(ua)) return "chrome"; return "other"; }); const extensionLink = browser === "firefox" ? "https://addons.mozilla.org/en-US/firefox/addon/margin/" : browser === "edge" ? "https://microsoftedge.microsoft.com/addons/detail/margin/nfjnmllpdgcdnhmmggjihjbidmeadddn" : "https://chromewebstore.google.com/detail/margin/cgpmbiiagnehkikhcbnhiagfomajncpa"; const ExtensionIcon = browser === "firefox" ? FaFirefox : browser === "edge" ? FaEdge : Chrome; const extensionLabel = browser === "firefox" ? "Firefox" : browser === "edge" ? "Edge" : "Chrome"; const [isScrolled, setIsScrolled] = React.useState(false); React.useEffect(() => { const handleScroll = () => { setIsScrolled(window.scrollY > 20); }; window.addEventListener("scroll", handleScroll, { passive: true }); return () => window.removeEventListener("scroll", handleScroll); }, []); return (
Fully open source{" "}

Write on the margins
of the internet.

Margin is an open annotation layer for the internet. Highlight text, leave notes, and bookmark pages, all stored on your decentralized identity with the{" "} AT Protocol . Not locked in a silo.

{user ? "Open App" : "Get Started"} Install for {extensionLabel}

Everything you need to engage with the web

More than bookmarks. A full toolkit for reading, thinking, and sharing on the open web.

Browser Extension

Your annotation toolkit,
right in the browser

The Margin extension brings the full annotation experience directly into every page you visit. Just select, annotate, and go.

Install for {extensionLabel} {browser !== "chrome" && ( Chrome )} {browser !== "firefox" && ( Firefox )} {browser !== "edge" && ( Edge )} iOS Shortcut
example.com/article/how-to-think-clearly
The point here is that Margin is indeed
the best thing ever
S
@scan.margin.cafe

I agree, Margin is just so good, like the other day I was drinking some of that Margin for breakfast

3 1
Decentralized

Your data, your identity

Margin is built on the{" "} AT Protocol , the open protocol that powers apps like Bluesky. Your annotations, highlights, and bookmarks are stored in your personal data repository, not locked in a silo.

  • Sign in with your AT Protocol handle, no new account needed
  • Your data lives in your PDS, portable and under your control
  • Custom Lexicon schemas for annotations, highlights, collections & more
  • Fully open source, check out the code and contribute
lexicon
at.margin.annotation
{"{"}
"type" : "record" ,
"record" : {"{"}
"body" : "Great insight..." ,
"target" : {"{"}
"source" : "https://..." ,
"selector" : {"{"}
"exact" : "selected text"
{"}"}
{"}"}
{"}"}
{"}"}

Start writing on the margins

Join the open annotation layer. Sign in with your AT Protocol identity and install the extension to get started.

{user ? "Open App" : "Sign in"} View on GitHub View on Tangled
Ko-fi GitHub Sponsors Open Collective
); }