# Nostr Poster An automated content posting bot for Nostr networks. This tool allows you to schedule regular posting of images and videos to Nostr relays, supporting both NIP-94 and Blossom upload services. # Nostr Poster ## Table of Contents - [Plan for Nostr Poster Improvements](#plan-for-nostr-poster-improvements) - [To-Do List](#to-do-list) ### Priority Order 1. [ ] Add Bot post Feed. 2. [ ] Pull comments from posts and allow replying from app for each bot. ## To-Do List ### Bot Profile Management Enhancements - [ ] Better Key managment. ### Relay Management Improvements - [ ] Include relay testing functionality - [ ] Add a "recommended relays" quick-add option - [ ] Include relay status indicators ### Post Scheduling and Auto-Posting Testing - [ ] Implement a post history view - [ ] Add a "test now" button that triggers an immediate post attempt ## Features - **Media Management**: Upload content to either NIP-94/96 compatible servers or Blossom storage servers - **Scheduled Posting**: Configure posting intervals for automated content sharing - **Multiple Bot Support**: Manage multiple bot identities, each with their own keypair - **Keypair Management**: Create new keypairs or import existing ones - **Relay Configuration**: Configure which relays to publish to for each bot - **Profile Management**: Set up and publish bot profiles (name, bio, avatar, etc.) - **Content Archiving**: Posted content gets archived to avoid duplicate posts - **hybrid Posting mode**: Makes both kind 1 and kind 20 posts as well as doing a hybrid post that makes a post of each type. ## Installation ### Requirements - Go 1.18 or higher - SQLite 3 ### Building from Source 1. Clone the repository: ```bash git clone https://github.com/yourusername/nostr-poster.git cd nostr-poster ``` 2. Build the application: ```bash make build ``` 3. Run the application: ```bash make run ``` ## Configuration The application can be configured via a YAML file or environment variables. By default, the config file is located at `/config.yaml`. ### Example Configuration ```yaml app_name: "Nostr Poster" server_port: 8080 log_level: "info" bot: keys_file: "./keys.json" content_dir: "./content" archive_dir: "./archive" default_interval: 60 # minutes db: path: "./nostr-poster.db" media: default_service: "nip94" nip94: server_url: "https://nostr.build/api/upload/nostr" require_auth: true blossom: server_url: "https://blossom.example.com" relays: - url: "wss://relay.damus.io" read: true write: true - url: "wss://nostr.mutinywallet.com" read: true write: true - url: "wss://relay.nostr.band" read: true write: true ``` ## Usage ### Set up a Bot 1. Navigate to the web interface at `http://localhost:8765` (or your configured domain) 2. Log in with your Nostr extension (NIP-07) 3. Create a new bot by providing a name and optional keypair 4. Configure the posting schedule, media upload service, and relays 5. Add content to the bot's content directory 6. Enable the bot to start automated posting ### Manual Posting You can also trigger a post manually through the web interface ## Production Deployment ### Nginx Configuration To serve Nostr Poster behind an Nginx reverse proxy with HTTPS, use the following configuration: ```nginx server { listen 80; server_name your-domain.com; # Redirect HTTP to HTTPS location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name your-domain.com; # SSL configuration ssl_certificate /path/to/your/fullchain.pem; ssl_certificate_key /path/to/your/privkey.pem; # Security headers add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options SAMEORIGIN; # Proxy settings location / { proxy_pass http://localhost:8765; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket support (for Nostr connections) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Timeout settings for long-lived connections proxy_read_timeout 86400; proxy_send_timeout 86400; } } ``` Make sure to replace `your-domain.com` with your actual domain name and update the SSL certificate paths accordingly. ### Systemd Service To run Nostr Poster as a system service that starts automatically on boot, create a systemd service file: 1. Create a systemd service file: ```bash sudo nano /etc/systemd/system/nostr-poster.service ``` 2. Add the following content: ```ini [Unit] Description=Nostr Poster Bot Service After=network.target [Service] Type=simple User=nostr WorkingDirectory=/path/to/nostr-poster ExecStart=/path/to/nostr-poster/build/bin/nostr-poster Restart=on-failure RestartSec=5 StandardOutput=journal StandardError=journal Environment=GIN_MODE=release # Hardening measures PrivateTmp=true ProtectSystem=full NoNewPrivileges=true ProtectHome=true [Install] WantedBy=multi-user.target ``` Replace `/path/to/nostr-poster` with the actual path to your installation, and `nostr` with the user you want to run the service as. 3. Enable and start the service: ```bash sudo systemctl daemon-reload sudo systemctl enable nostr-poster sudo systemctl start nostr-poster ``` 4. Check the status of the service: ```bash sudo systemctl status nostr-poster ``` 5. View logs: ```bash sudo journalctl -u nostr-poster -f ``` ## NIPs Supported - NIP-01: Basic protocol flow - NIP-07: Browser extension authentication - NIP-55: Android signer application (soon TM) - NIP-94: File metadata - NIP-96: HTTP file storage - NIP-98: HTTP authentication ## License This project is licensed under the MIT License - see the LICENSE file for details. ## Contributing Contributions are welcome! Please feel free to submit a Pull Request.