<!DOCTYPE html> <html lang="en" data-bs-theme="dark"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Nostr Poster</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <link rel="stylesheet" href="/assets/css/style.css"> <script type="module"> import { nip19 } from 'https://esm.sh/nostr-tools@1.10.0?bundle'; window.nostrTools = { nip19 }; </script> <script src="/assets/js/main.js"></script> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark"> <div class="container"> <a class="navbar-brand" href="/"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="bi bi-send-fill me-2" viewBox="0 0 16 16"> <path d="M15.964.686a.5.5 0 0 0-.65-.65L.767 5.855H.766l-.452.18a.5.5 0 0 0-.082.887l.41.26.001.002 4.995 3.178 3.178 4.995.002.002.26.41a.5.5 0 0 0 .886-.083l6-15Zm-1.833 1.89L6.637 10.07l-.215-.338a.5.5 0 0 0-.154-.154l-.338-.215 7.494-7.494 1.178-.471-.47 1.178Z" /> </svg> Nostr Poster </a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" href="/#bots"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-robot me-1" viewBox="0 0 16 16"> <path d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z" /> <path d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z" /> </svg> Bots </a> </li> <li class="nav-item"> <a class="nav-link" href="/content.html"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-images me-1" viewBox="0 0 16 16"> <path d="M4.502 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z" /> <path d="M14.002 13a2 2 0 0 1-2 2h-10a2 2 0 0 1-2-2V5A2 2 0 0 1 2 3a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v8a2 2 0 0 1-1.998 2zM14 2H4a1 1 0 0 0-1 1h9.002a2 2 0 0 1 2 2v7A1 1 0 0 0 15 11V3a1 1 0 0 0-1-1zM2.002 4a1 1 0 0 0-1 1v8l2.646-2.354a.5.5 0 0 1 .63-.062l2.66 1.773 3.71-3.71a.5.5 0 0 1 .577-.094l1.777 1.947V5a1 1 0 0 0-1-1h-10z" /> </svg> Content </a> </li> </ul> <ul class="navbar-nav ms-auto"> <li class="nav-item" id="loginButton"> <button class="btn btn-primary"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-lightning-fill me-1" viewBox="0 0 16 16"> <path d="M5.52.359A.5.5 0 0 1 6 0h4a.5.5 0 0 1 .474.658L8.694 6H12.5a.5.5 0 0 1 .395.807l-7 9a.5.5 0 0 1-.873-.454L6.823 9.5H3.5a.5.5 0 0 1-.48-.641l2.5-8.5z" /> </svg> Login with Nostr </button> </li> <li class="nav-item d-none" id="userInfo"> <span class="nav-link">Welcome, <span id="userPubkey" class="pubkey"></span></span> </li> <li class="nav-item d-none" id="logoutButton"> <button class="btn btn-outline-danger">Logout</button> </li> </ul> </div> </div> </nav> <div class="container mt-4"> <div id="auth-section"> <div class="card"> <div class="card-body text-center"> <h2 class="mb-4">Welcome to Nostr Poster</h2> <div class="row justify-content-center"> <div class="col-md-8"> <div class="mb-4"> <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" fill="#9370DB" class="bi bi-lightning-charge-fill" viewBox="0 0 16 16"> <path d="M11.251.068a.5.5 0 0 1 .227.58L9.677 6.5H13a.5.5 0 0 1 .364.843l-8 8.5a.5.5 0 0 1-.842-.49L6.323 9.5H3a.5.5 0 0 1-.364-.843l8-8.5a.5.5 0 0 1 .615-.09z" /> </svg> </div> <p class="lead mb-4">Automate your Nostr content posting with ease. Schedule posts, manage multiple bots, and more.</p> <p>Please login with your Nostr extension (NIP-07) to manage your bots.</p> <button class="btn btn-primary btn-lg px-4 mt-3" onclick="document.getElementById('loginButton').querySelector('button').click()"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-lightning-fill me-2" viewBox="0 0 16 16"> <path d="M5.52.359A.5.5 0 0 1 6 0h4a.5.5 0 0 1 .474.658L8.694 6H12.5a.5.5 0 0 1 .395.807l-7 9a.5.5 0 0 1-.873-.454L6.823 9.5H3.5a.5.5 0 0 1-.48-.641l2.5-8.5z" /> </svg> Login with Nostr </button> </div> </div> </div> </div> </div> <div id="main-content" class="d-none"> <div id="bots-section"> <div class="d-flex justify-content-between align-items-center mb-4"> <h2> <svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="#9370DB" class="bi bi-robot me-2" viewBox="0 0 16 16"> <path d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z" /> <path d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z" /> </svg> Your Bots </h2> <button id="create-bot-btn" class="btn btn-success"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-lg me-1" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M8 2a.5.5 0 0 1 .5.5v5h5a.5.5 0 0 1 0 1h-5v5a.5.5 0 0 1-1 0v-5h-5a.5.5 0 0 1 0-1h5v-5A.5.5 0 0 1 8 2Z" /> </svg> Create New Bot </button> </div> <div id="bots-list" class="row"> <!-- Bot cards will be rendered here --> </div> </div> </div> </div> <!-- Create Bot Modal --> <div class="modal fade" id="createBotModal" tabindex="-1"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#9370DB" class="bi bi-robot me-2" viewBox="0 0 16 16"> <path d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z" /> <path d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z" /> </svg> Create New Bot </h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <form id="create-bot-form"> <div class="mb-3"> <label for="botName" class="form-label">Bot Name</label> <input type="text" class="form-control" id="botName" required placeholder="e.g., MyArtBot"> </div> <div class="mb-3"> <label for="botDisplayName" class="form-label">Display Name</label> <input type="text" class="form-control" id="botDisplayName" placeholder="e.g., My Art Posting Bot"> </div> <div class="mb-3"> <label for="botBio" class="form-label">Bio</label> <textarea class="form-control" id="botBio" rows="3" placeholder="A brief description of your bot..."></textarea> </div> <div class="mb-3"> <label for="botNip05" class="form-label">NIP-05 Identifier</label> <input type="text" class="form-control" id="botNip05" placeholder="e.g., bot@yourdomain.com"> <div class="form-text">Optional. Used for verification.</div> </div> <hr class="border-secondary"> <div class="mb-3"> <label for="keyOption" class="form-label">Key Option</label> <select class="form-select" id="keyOption"> <option value="generate" selected>Generate new keypair</option> <option value="import">Import existing NSEC key</option> </select> </div> <div id="nsecKeyInput" class="mb-3" style="display: none;"> <label for="botNsecKey" class="form-label">NSEC Private Key</label> <div class="input-group"> <input type="password" class="form-control" id="botNsecKey" placeholder="nsec1..."> <button class="btn btn-secondary" type="button" id="toggleNsecKey"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16"> <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z" /> <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z" /> </svg> </button> </div> <div class="form-text">Enter your private key in nsec format. Your public key will be derived automatically.</div> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancel</button> <button type="button" class="btn btn-primary" id="save-bot-btn"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-lg me-1" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M8 2a.5.5 0 0 1 .5.5v5h5a.5.5 0 0 1 0 1h-5v5a.5.5 0 0 1-1 0v-5h-5a.5.5 0 0 1 0-1h5v-5A.5.5 0 0 1 8 2Z" /> </svg> Create Bot </button> </div> </div> </div> </div> <!-- Bot Settings Modal --> <div class="modal fade" id="botSettingsModal" tabindex="-1"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Bot Settings</h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <form id="bot-settings-form"> <!-- Basic fields --> <div class="mb-3"> <label for="botSettingsName" class="form-label">Name</label> <input type="text" class="form-control" id="botSettingsName"> </div> <div class="mb-3"> <label for="botSettingsDisplayName" class="form-label">Display Name</label> <input type="text" class="form-control" id="botSettingsDisplayName"> </div> <div class="mb-3"> <label for="botSettingsBio" class="form-label">Bio</label> <textarea class="form-control" id="botSettingsBio" rows="2"></textarea> </div> <div class="mb-3"> <label for="botSettingsNip05" class="form-label">NIP-05</label> <input type="text" class="form-control" id="botSettingsNip05"> </div> <div class="mb-3"> <label for="botSettingsZap" class="form-label">Zap Address</label> <input type="text" class="form-control" id="botSettingsZap"> </div> <hr> <!-- Post config fields --> <div class="mb-3"> <label for="botSettingsInterval" class="form-label">Posting Interval (minutes)</label> <input type="number" class="form-control" id="botSettingsInterval" value="60"> </div> <div class="mb-3"> <label for="botSettingsHashtags" class="form-label">Hashtags (comma-separated)</label> <input type="text" class="form-control" id="botSettingsHashtags"> </div> </form> </div> <div class="modal-footer"> <button class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button> <button class="btn btn-primary" id="botSettingsSaveBtn" onclick="saveBotSettings()"> Save </button> </div> </div> </div> </div> </body> </html>