a web app for declaring if an atproto account is automated + package for the lexicon jsr.io/@voyager/autonomy-lexicon
atprotocol lexicon
HTML 71.6%
JavaScript 14.6%
TypeScript 13.8%
10 1 0

Clone this repository

https://tangled.org/taurean.bryant.land/atproto-autonomy-declaration
git@tangled.org:taurean.bryant.land/atproto-autonomy-declaration

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

README.md

@voyager/autonomy-lexicon#

ATProtocol lexicon for declaring automation and AI usage on Bluesky. This package provides TypeScript types and the lexicon definition for the studio.voyager.account.autonomy record type.

Installation#

# Deno
import { AutonomyDeclaration } from "jsr:@voyager/autonomy-lexicon";

# Node.js / npm
npx jsr add @voyager/autonomy-lexicon

Usage#

Creating an Autonomy Declaration#

import { AtpAgent } from "@atproto/api";
import type { AutonomyDeclaration } from "@voyager/autonomy-lexicon";

const agent = new AtpAgent({ service: "https://bsky.social" });
await agent.login({
  identifier: "your-handle.bsky.social",
  password: "your-app-password",
});

const declaration: AutonomyDeclaration = {
  automationLevel: "collaborative",
  usesGenerativeAI: true,
  description: "AI-assisted account using Claude for content creation",
  responsibleParty: {
    type: "person",
    name: "Your Name",
    contact: "you@example.com",
  },
  externalServices: ["Claude API", "Railway"],
  createdAt: new Date().toISOString(),
};

await agent.com.atproto.repo.putRecord({
  repo: agent.session?.did,
  collection: "studio.voyager.account.autonomy",
  rkey: "self",
  record: declaration,
});

Reading an Autonomy Declaration#

import { AtpAgent } from "@atproto/api";
import type { AutonomyDeclaration } from "@voyager/autonomy-lexicon";

const agent = new AtpAgent({ service: "https://bsky.social" });

const { data } = await agent.com.atproto.repo.getRecord({
  repo: "some-account.bsky.social",
  collection: "studio.voyager.account.autonomy",
  rkey: "self",
});

const declaration = data.value as AutonomyDeclaration;
console.log(`Automation level: ${declaration.automationLevel}`);

Importing the Lexicon#

import { AUTONOMY_DECLARATION_LEXICON } from "@voyager/autonomy-lexicon";

// Use with lexicon registry or validation
console.log(AUTONOMY_DECLARATION_LEXICON.id);
// => "studio.voyager.account.autonomy"

Types#

AutonomyDeclaration#

The main record type for autonomy declarations.

interface AutonomyDeclaration {
  automationLevel?: AutomationLevel;
  usesGenerativeAI?: boolean;
  description?: string; // max 300 graphemes
  responsibleParty?: ResponsibleParty;
  disclosureUrl?: string;
  externalServices?: string[]; // max 20 items, 200 chars each
  createdAt: string; // ISO 8601 datetime (required)
}

AutomationLevel#

type AutomationLevel = "human" | "assisted" | "collaborative" | "automated";
  • human - No automation, fully human-operated
  • assisted - Human with AI/automation assistance
  • collaborative - Human-AI collaboration with shared agency
  • automated - Fully automated with minimal human intervention

ResponsibleParty#

interface ResponsibleParty {
  type?: ResponsiblePartyType; // "person" | "organization"
  name?: string; // max 100 graphemes
  contact?: string; // email, URL, handle, or DID (max 300 chars)
  did?: string; // ATProto DID
}

Lexicon Details#

  • Lexicon ID: studio.voyager.account.autonomy
  • Record Key: literal:self (each account has exactly one declaration)
  • Collection: Uses standard ATProto record collection semantics
  • Required Fields: Only createdAt is required; all other fields are optional

Web Form#

A web interface for submitting autonomy declarations is available at: https://github.com/voyagerstudio/atp-autonomy-declaration

License#

MIT