SCTY Lab

A link inbox for humans and agents.

Share a link from your phone. linkdrop writes it to disk as a markdown file and answers with a JSON receipt. Any person, script or agent that can read a folder can read your inbox.

View on GitHub

The file is the database

Each capture is its own folder. The folder holds one capture.md with YAML frontmatter, plus the attachment if you sent a file. There are no accounts and no sync. linkdrop writes a capture once and never rewrites it. If you send the same capture again on the same day, you get the first receipt back.

linkdrop-inbox/
└── 2026-11-15-e2c51e5084b1-example/
    └── capture.md
---
title: "Example"
type: "source"
status: "raw"
privacy_tier: "private"
source_type: "link"
captured_at: "2026-11-15T15:55:25.559Z"
channel: "ios-share-sheet"
content_sha256: "e2c51e5084b1…"
url: "https://example.com/"
---

# Example

## Source

<https://example.com/>
A real capture from the quickstart below. The hash is shortened here.

Quickstart

Zero dependencies. The server is one file that uses only Node's built-in modules. There is no install step.

git clone https://github.com/SCTY-Inc/linkdrop && cd linkdrop
CAPTURE_DIR=~/linkdrop-inbox node server.js
curl -X POST localhost:18790/links -H 'content-type: application/json' -d '{"content":"https://example.com"}'

Requires Node 22 or later. The server has no authentication, so keep it on a private network. For a phone, point an iOS Shortcut at POST /links.

Why

Where should a link go when you are not ready to read it, and you want an agent to read it later?

Read-later apps keep links behind an account and a sync service. An agent can read a folder of markdown with no setup, so the inbox should be that folder.

So linkdrop does one thing. It takes a link, some text or one file, writes it down and returns. Capture does not fetch the page or summarize it. A separate script, enrich.js, can fetch public context for one capture later. It writes an enriched.md next to the original and never overwrites one that exists.

Enrichment is where it failed. Long X articles were the hard case, and it took two fixes before enrich.js saved the full article text. When it gets only a preview now, it writes nothing, so a reader who finds no enriched.md knows to open the link.

If you delete it tomorrow, you lose nothing

Your captures are plain files in CAPTURE_DIR. linkdrop does not need to run for you to read, grep, move or back them up. The quickstart keeps them in ~/linkdrop-inbox, outside the clone, so deleting linkdrop leaves them in place.