home / skills / rawveg / skillsforge-marketplace / writeas

writeas skill

/writeas

npx playbooks add skill rawveg/skillsforge-marketplace --skill writeas

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
9.7 KB
---
name: writeas
description: Write.as API Documentation
---

# Write.as Skill

Comprehensive assistance with Write.as and WriteFreely API development, based on official API documentation. This skill provides practical guidance for building applications around the Write.as blogging platform and its open-source WriteFreely implementation.

## When to Use This Skill

This skill should be triggered when:
- Working with the Write.as REST API (`https://write.as/api/`)
- Building applications that interact with Write.as or WriteFreely
- Implementing blog post creation, updates, or management
- Setting up user authentication for Write.as accounts
- Creating or managing collections (blogs)
- Implementing crossposting to Twitter, Medium, or Tumblr
- Integrating Markdown rendering for blog posts
- Debugging Write.as API calls or authentication issues
- Working with anonymous posts and post claiming
- Building self-hosted WriteFreely instances

## Key Concepts

### Core Terminology

**Posts**: Markdown-based articles with metadata. Posts can be created anonymously or associated with a user account.

**Collections**: Known as "blogs" in the UI. Container for multiple posts with customizable settings. Creating collections requires a Pro account.

**Users**: Registered accounts with password, email, and resource access. Users can own multiple collections and posts.

**Tokens**: Used for authentication and post management. Anonymous posts return a `token` for later modifications, while user operations use access tokens via `Authorization: Token {access_token}` header.

### Authentication

- **Anonymous**: No authentication required. Store the returned `token` for later updates/deletions.
- **User-based**: Login via `/api/auth/login` to get an access token, then pass it in the `Authorization` header.

## Quick Reference

### Creating an Anonymous Post

```json
POST https://write.as/api/posts
Content-Type: application/json

{
  "body": "This is a post.",
  "title": "My First Post"
}
```

**Response:**
```json
{
  "code": 201,
  "data": {
    "id": "rf3t35fkax0aw",
    "token": "ozPEuJWYK8L1QsysBUcTUKy9za7yqQ4M",
    "title": "My First Post",
    "body": "This is a post."
  }
}
```

**Note**: Save the `token` to update or delete this post later.

### Updating a Post (Anonymous)

```json
POST https://write.as/api/posts/{POST_ID}
Content-Type: application/json

{
  "token": "ozPEuJWYK8L1QsysBUcTUKy9za7yqQ4M",
  "body": "This is an updated post."
}
```

### User Authentication

```json
POST https://write.as/api/auth/login
Content-Type: application/json

{
  "alias": "username",
  "pass": "password"
}
```

**Response:**
```json
{
  "code": 200,
  "data": {
    "access_token": "00000000-0000-0000-0000-000000000000",
    "user": {
      "username": "username"
    }
  }
}
```

### Creating a Post as Authenticated User

```json
POST https://write.as/api/posts
Authorization: Token 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "body": "# My authenticated post\n\nThis post is linked to my account.",
  "title": "Authenticated Post"
}
```

### Styling Posts with Fonts

```json
POST https://write.as/api/posts
Content-Type: application/json

{
  "body": "This is a monospace code post.",
  "font": "code"
}
```

**Available fonts:**
- `sans` - Sans-serif with word wrap
- `serif` or `norm` - Serif with word wrap
- `wrap` - Monospace with word wrap
- `mono` - Monospace without wrap
- `code` - Syntax-highlighted monospace

### Crossposting to Social Media

```json
POST https://write.as/api/posts
Authorization: Token 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "body": "Check out my new post!",
  "title": "My Post",
  "crosspost": [
    {"twitter": "yourusername"},
    {"medium": "yourusername"}
  ]
}
```

**Supported services**: Twitter, Tumblr, Medium

### Creating a Collection (Pro Feature)

```json
POST https://write.as/api/collections
Authorization: Token 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "alias": "my-blog",
  "title": "My Blog"
}
```

### Publishing to a Collection

```json
POST https://write.as/api/collections/{ALIAS}/posts
Authorization: Token 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "body": "# First blog post\n\nWelcome to my blog!",
  "title": "Hello World"
}
```

### Moving Anonymous Post to Collection

```json
POST https://write.as/api/collections/{ALIAS}/collect
Authorization: Token 00000000-0000-0000-0000-000000000000
Content-Type: application/json

[
  {
    "id": "rf3t35fkax0aw",
    "token": "ozPEuJWYK8L1QsysBUcTUKy9za7yqQ4M"
  }
]
```

### Rendering Markdown to HTML

```json
POST https://write.as/api/markdown
Content-Type: application/json

{
  "raw_body": "# Hello\n\nThis is **Markdown**."
}
```

**Response:**
```json
{
  "code": 200,
  "data": {
    "body": "<h1>Hello</h1>\n<p>This is <strong>Markdown</strong>.</p>"
  }
}
```

## Error Handling

All API responses follow this structure:

```json
{
  "code": 200,
  "data": {}
}
```

**Common HTTP status codes:**
- `200` - Success
- `201` - Created successfully
- `400` - Bad request or malformed data
- `401` - Missing or invalid authentication
- `403` - Insufficient permissions (e.g., creating collection without Pro)
- `404` - Resource not found
- `410` - Post unpublished (may return later)
- `429` - Rate limited

## Reference Files

This skill includes comprehensive documentation in `references/`:

- **api.md** - Complete Write.as API documentation including:
  - All available endpoints (posts, collections, users, formatting)
  - Request/response examples
  - Authentication methods
  - Crossposting configuration
  - Error codes and handling

Use `view` to read the API reference file when detailed information is needed.

## Working with This Skill

### For Beginners

1. **Start with anonymous posts**: No authentication required, perfect for testing
2. **Save the token**: Always store the `token` returned when creating anonymous posts
3. **Test with single posts**: Create, update, retrieve, and delete one post before scaling
4. **Read error responses**: The API provides clear error messages in the response body

### For Intermediate Users

1. **Implement user authentication**: Use `/api/auth/login` to get access tokens
2. **Work with collections**: Create blogs and organize posts into collections
3. **Enable crossposting**: Automatically share posts to Twitter, Medium, or Tumblr
4. **Claim anonymous posts**: Convert anonymous posts to user-owned posts with `/api/posts/claim`
5. **Use post styling**: Apply different fonts (`code`, `sans`, `mono`) for various content types

### For Advanced Users

1. **Build full applications**: Leverage all endpoints for complete blog management
2. **Self-host WriteFreely**: Deploy open-source WriteFreely instances
3. **Implement rate limiting**: Respect API limits and handle 429 responses
4. **Use client libraries**: Leverage official libraries (Go, Swift, Java) or community libraries (PHP, Python, JavaScript, .NET)
5. **Handle edge cases**: Implement retry logic, token refresh, and error recovery

### Navigation Tips

- **Authentication flow**: See `api.md` → "Users" section
- **Post management**: See `api.md` → "Posts" section
- **Collection setup**: See `api.md` → "Collections" section
- **Crossposting**: See `api.md` → "Crossposting" section
- **Error handling**: See `api.md` → "Error Handling" section

## API Best Practices

1. **Store tokens securely**: Never commit access tokens or post tokens to version control
2. **Handle anonymous posts**: Always save the `token` field when creating anonymous posts
3. **Respect rate limits**: Implement exponential backoff on 429 responses
4. **Use HTTPS**: All API endpoints require HTTPS
5. **Test with small datasets**: Verify your integration with a few posts before scaling
6. **Check Pro status**: Collection creation requires a Pro account
7. **Validate Markdown**: Test Markdown rendering with `/api/markdown` before posting
8. **Handle 410 gracefully**: Unpublished posts may return with 410 status

## Common Use Cases

### Building a Blog Publishing Tool
Use authenticated user endpoints to create collections, publish posts, and manage content.

### Creating a Markdown Editor Integration
Implement post creation with Markdown preview using `/api/markdown` endpoint.

### Social Media Cross-Poster
Leverage the `crosspost` parameter to automatically share posts to multiple platforms.

### Anonymous Blogging Platform
Build an app using anonymous post creation, storing tokens locally for later management.

### Content Migration Tool
Use `/api/posts/claim` to import anonymous posts into a user account.

## Client Libraries

**Official:**
- Go: https://github.com/writeas/go-writeas
- Swift: https://github.com/writeas/writefreely-swift
- Java: https://github.com/writeas/java-writeas

**Community:**
- PHP, Python, JavaScript, Vala, .NET Core (see Write.as documentation)

## Resources

### Official Documentation
- API Docs: https://developers.write.as/docs/api/
- WriteFreely: https://writefreely.org/ (open-source self-hosting)

### Key Features
- **Backwards compatibility**: Endpoints rarely removed; new features added alongside existing
- **Flexible authentication**: Works anonymously or with user tokens
- **Markdown-first**: All content uses Markdown formatting
- **Self-hosting ready**: WriteFreely powers Write.as and independent instances

## Notes

- All API requests must use HTTPS
- Anonymous posts can be claimed by authenticated users
- Collections (blogs) require a Pro subscription on Write.as
- Post IDs are permanent and unique
- Tokens are sensitive credentials - protect them like passwords
- The API maintains backwards compatibility - old integrations continue working

## Updating

This skill is based on the official Write.as API documentation. For the latest updates, refer to:
- https://developers.write.as/docs/api/