✓ Verified 📁 File Management ✓ Enhanced Data

X To Kindle

Send X/Twitter posts to Kindle for distraction-free reading.

Rating
4.1 (342 reviews)
Downloads
1,048 downloads
Version
1.0.0

Overview

Send X/Twitter posts to Kindle for distraction-free reading.

Complete Documentation

View Source →

X to Kindle

Convert X/Twitter posts into Kindle-readable documents via email.

Requirements

  • Gmail account with App Password (or other SMTP setup)
  • Kindle email address (found in Amazon account settings)

Workflow

When user shares an X link:

  • Extract content via fxtwitter API:
text
https://api.fxtwitter.com/status/<tweet_id>
Extract from URL: twitter.com//status/ or x.com//status/
  • Format as HTML file (save to /tmp):
html
<!DOCTYPE html>
   <html>
   <head><meta charset="UTF-8"><title>{title}</title></head>
   <body style="font-family: Georgia, serif; max-width: 600px; margin: 0 auto; padding: 20px; line-height: 1.6;">
     <h1>@{author_handle}</h1>
     <p>{tweet_text}</p>
     <p><em>{timestamp}</em></p>
     <p><a href="{original_url}">View on X</a></p>
   </body>
   </html>
  • Send via SMTP with HTML as ATTACHMENT (Kindle requires attachment, not inline HTML):
python
from email.mime.multipart import MIMEMultipart
   from email.mime.text import MIMEText
   from email.mime.base import MIMEBase
   from email import encoders
   
   msg = MIMEMultipart()
   msg['Subject'] = "Tweet from @handle"
   msg['From'] = from_email
   msg['To'] = kindle_email
   
   # Plain text body (not the content)
   msg.attach(MIMEText("Article attached.", 'plain'))
   
   # HTML file as attachment - THIS IS REQUIRED
   with open("/tmp/article.html", "rb") as f:
       attachment = MIMEBase('text', 'html')
       attachment.set_payload(f.read())
       encoders.encode_base64(attachment)
       attachment.add_header('Content-Disposition', 'attachment', filename='article.html')
       msg.attach(attachment)

Tools

  • send_to_kindle: Send a local file to the configured Kindle email.

Configuration

Set the following environment variables in your Clawdbot configuration (or .env file):

  • SMTP_EMAIL: Your sender email (e.g., gmail)
  • SMTP_PASSWORD: Your app password
  • KINDLE_EMAIL: Your Kindle email address
  • SMTP_SERVER: (Optional) Default: smtp.gmail.com
  • SMTP_PORT: (Optional) Default: 587

Tool Definitions

send_to_kindle

Send a local file (PDF, HTML, TXT) to the Kindle.
  • Run: python3 skills/x-to-kindle/send_to_kindle.py

Configuration

Store in TOOLS.md:

markdown
## Kindle
- Address: [email protected]

## Email (Gmail SMTP)
- From: [email protected]
- App Password: xxxx xxxx xxxx xxxx
- Host: smtp.gmail.com
- Port: 587

Example

User sends: https://x.com/elonmusk/status/1234567890

  • Fetch https://api.fxtwitter.com/status/1234567890
  • Extract author, text, timestamp
  • Send HTML email to Kindle address
  • Confirm: "Sent to Kindle 📚"

Installation

Terminal bash

openclaw install x-to-kindle
    
Copied!

💻Code Examples

Store in TOOLS.md:

store-in-toolsmd.md
## Kindle
- Address: [email protected]

## Email (Gmail SMTP)
- From: [email protected]
- App Password: xxxx xxxx xxxx xxxx
- Host: smtp.gmail.com
- Port: 587
example.html
<!DOCTYPE html>
   <html>
   <head><meta charset="UTF-8"><title>{title}</title></head>
   <body style="font-family: Georgia, serif; max-width: 600px; margin: 0 auto; padding: 20px; line-height: 1.6;">
     <h1>@{author_handle}</h1>
     <p>{tweet_text}</p>
     <p><em>{timestamp}</em></p>
     <p><a href="{original_url}">View on X</a></p>
   </body>
   </html>
example.py
from email.mime.multipart import MIMEMultipart
   from email.mime.text import MIMEText
   from email.mime.base import MIMEBase
   from email import encoders
   
   msg = MIMEMultipart()
   msg['Subject'] = "Tweet from @handle"
   msg['From'] = from_email
   msg['To'] = kindle_email
   
   # Plain text body (not the content)
   msg.attach(MIMEText("Article attached.", 'plain'))
   
   # HTML file as attachment - THIS IS REQUIRED
   with open("/tmp/article.html", "rb") as f:
       attachment = MIMEBase('text', 'html')
       attachment.set_payload(f.read())
       encoders.encode_base64(attachment)
       attachment.add_header('Content-Disposition', 'attachment', filename='article.html')
       msg.attach(attachment)

⚙️Configuration Options

Option Type Default Description
SMTP_EMAILstring-Your sender email (e.g., gmail)
SMTP_PASSWORDstring-Your app password
KINDLE_EMAILstring-Your Kindle email address
SMTP_SERVERstring-(Optional) Default: smtp.gmail.com
SMTP_PORTstring-(Optional) Default: 587

Tags

#pdf_and-documents

Quick Info

Category File Management
Model Claude 3.5
Complexity One-Click
Author brianlu365ai
Last Updated 3/10/2026
🚀
Optimized for
Claude 3.5
🧠

Ready to Install?

Get started with this skill in seconds

openclaw install x-to-kindle