Markdown -> Semble importer
TypeScript 61.9%
Svelte 27.6%
CSS 7.9%
JavaScript 1.9%
HTML 0.6%
Shell 0.1%
12 1 0

Clone this repository

https://tangled.org/oscillatory.net/md2semble https://tangled.org/did:plc:ncwcsl2uejt5ci5qgn7spgis/md2semble
git@tangled.org:oscillatory.net/md2semble git@tangled.org:did:plc:ncwcsl2uejt5ci5qgn7spgis/md2semble

For self-hosted knots, clone URLs may differ based on your setup.

Download tar.gz
README.md

Markdown -> Semble Importer#

Static Svelte app to stage Semble bookmark imports from a URL or pasted markdown, enrich with Citoid metadata, compare with existing Semble records, and create only new cards/collections.

Local dev#

npm install
npm run dev

Environment config#

Set OAuth settings via Vite env vars (build-time):

  • VITE_HANDLE_RESOLVER (default: https://bsky.social)
  • VITE_CLIENT_ID (example: https://md2semble.example.com/client-metadata.json)
  • VITE_REDIRECT_URI (example: https://md2semble.example.com/)
  • VITE_OAUTH_SCOPE (default: atproto)
  • VITE_CLIENT_NAME (default: Markdown Semble Importer)
  • VITE_OAUTH_RESPONSE_MODE (default: query)

Copy .env.example to .env.local and update the values for your deployment.

OAuth setup#

This app uses OAuth PKCE against the ATProto authorization server (default https://bsky.social).

  1. Generate public/client-metadata.json using your env vars:

    npm run gen:client-metadata
    

    The generated file is ignored in git; public/client-metadata.json.example is the template.

  2. Deploy the static build to your subdomain.

  3. Ensure the deployed origin matches the client_id and redirect URI.

For example, with https://md2semble.example.com:

  • client_id should be https://md2semble.example.com/client-metadata.json
  • redirect_uris should include https://md2semble.example.com/
  • public/client-metadata.json.example is committed; public/client-metadata.json is generated locally.

If you host your own PDS, set VITE_HANDLE_RESOLVER to its base URL for handle resolution.

Source format#

# Collection name
- https://example.com : optional note
- [Optional title](https://example.com)