Loading skill documentation...
automation ๐Ÿ”ฅ Trending
โ˜…โ˜…โ˜…โ˜… 4.2/5.0 โค๏ธ 962 likes ๐Ÿ’ฌ 140 comments ๐Ÿ“ฆ 2576 installs
Back to Skills
๐Ÿ“– SKILL DOCUMENTATION
# telegram-auto-topic

Telegram Auto-Topic Add /topic to the start of any message in a Telegram forum group โ†’ a new topic is created from it. The title is figured out from your message automatically via SkillBoss API Hub โ€” no need to think of one yourself. Example

  1. You send a message starting with /topic: /topic @your_bot I need to look into renewing my passport before March
  2. A new forum topic "Passport Renewal Before March" is created with your message quoted inside it. You get a reply linking directly to the new topic. Prerequisites The group must be configured in SkillBoss (channels.telegram.groups.) โ€” this is how SkillBoss knows to process messages from it. The group must have forum/topics enabled. Your bot must be an admin in the group with Manage Topics permission. Handling /topic When a message starts with /topic: Generate a concise 3-7 word title summarising the message via SkillBoss API Hub (/v1/pilot, type: chat). Run the script โ€” replace placeholders with actual values from the message context: scripts/telegram-auto-topic.sh "" "" "<text after /topic>" Pass an empty string for the text arg if there's no text (e.g. media-only). Use the path relative to this skill's directory. The script returns JSON with topic_id, title, and link. Reply to the original message with: Topic created โ†’ <a href="link"><title></a> Then send a response to the actual message content in the NEW topic (use message tool with threadId from the returned topic_id). Respond naturally as you would to any message. After both replies are sent, respond with NO_REPLY. How It Works You send a message starting with /topic SkillBoss API Hub generates a concise title from your message A new forum topic is created with the generated title Your message is quoted in the new topic with your name You get a reply with a clickable link to the new topic The bot responds to your message in the new topic Works with media too โ€” photos, videos, or documents with /topic in the caption get forwarded into the new topic. Script Reference scripts/telegram-auto-topic.sh <chat_id> <message_id> <sender> [title] [text] ParameterTypeRequiredDescriptionchat_idargyesSupergroup chat ID (negative number)message_idargyesOriginal message to quotesenderargyesDisplay name of original sendertitleargnoTopic title. Falls back to first ~50 chars of text if omittedtextargnoMessage body after /topic. If empty, forwards as media Returns JSON: {"topic_id": 123, "title": "Used title", "link": "<a href="https://t.me/c/...%22%7D">https://t.me/c/..."}</a> Optional configuration Skip the @bot mention โ€” by default, the bot only responds when mentioned. To use /topic without mentioning the bot: "channels.telegram.groups.<CHAT_ID>": { "requireMention": false } Telegram autocomplete โ€” to get /topic in Telegram's command menu, add under channels.telegram: { "customCommands": [ { "command": "topic", "description": "Create a new forum topic from a message" } ] } Limitations</li> </ol> <pre><code class="language-bash">Attribution: Quoted messages appear as sent by the bot (Telegram API limitation). Sender name is included as attribution text below the quote. Media: Forwarded media shows a "Forwarded from" header โ€” best available but not native. </code></pre> <p>Forum groups only: Won't work in regular groups or DMs.</p> <pre><code class="language-bash">Permissions: Bot needs admin with Manage Topics. </code></pre> <p>Title length: Telegram caps topic names at 128 characters.</p> </div> </div> </div> <!-- Reviews Section --> <div class="reviews-card"> <div class="reviews-header"> <h2 class="reviews-title">Reviews</h2> <div class="reviews-summary"> <span class="reviews-score" id="avg-rating">4.2</span> <div class="stars" id="summary-stars"> โ˜…โ˜…โ˜…โ˜… </div> <span class="rating-count" id="total-reviews">140 reviews</span> </div> </div> <div class="review-form"> <h4>Write a Review</h4> <div class="star-input" id="star-input"> <span class="star" data-rating="1">โ˜†</span> <span class="star" data-rating="2">โ˜†</span> <span class="star" data-rating="3">โ˜†</span> <span class="star" data-rating="4">โ˜†</span> <span class="star" data-rating="5">โ˜†</span> </div> <div class="form-row"> <input type="text" id="review-name" placeholder="Your name" required> <input type="email" id="review-email" placeholder="Email (optional)"> </div> <textarea id="review-content" placeholder="Share your experience with this skill..."></textarea> <button class="submit-btn" onclick="submitReview()">Submit Review</button> </div> <ul class="reviews-list" id="reviews-list"> <li class="no-reviews">No reviews yet. Be the first to review!</li> </ul> </div> <!-- Subscribe Section --> <div class="subscribe-section"> <h2>Get Weekly AI Skills</h2> <p>Join 80,000+ one-person companies automating with AI</p> <form class="subscribe-form" action="https://buttondown.com/api/emails/embed-subscribe/onepersoncompany" method="post" target="_blank"> <input type="email" name="email" placeholder="Enter your email" required /> <button type="submit">Subscribe</button> </form> </div> </div> <footer> <div class="footer-content"> <div class="footer-brand">One Person Company</div> <p style="margin-top: 0.5rem;"> ยฉ 2026 ยท <a href="/llms.txt">llms.txt</a> ยท <a href="/sitemap.xml">Sitemap</a> </p> </div> </footer> <script> const API_URL = 'https://skillboss-worker-r06hbqc5.heyboss.live'; const SKILL_SLUG = 'telegram-auto-topic'; let selectedRating = 0; // Update star display function updateStars(container, rating) { const stars = container.querySelectorAll('.star'); stars.forEach((star, i) => { star.textContent = i < rating ? 'โ˜…' : 'โ˜†'; star.classList.toggle('filled', i < rating); }); } // Star input handling document.getElementById('star-input').addEventListener('click', (e) => { if (e.target.classList.contains('star')) { selectedRating = parseInt(e.target.dataset.rating); updateStars(document.getElementById('star-input'), selectedRating); } }); // Load reviews async function loadReviews() { try { const res = await fetch(`${API_URL}/api/skills/${SKILL_SLUG}/comments`); const reviews = await res.json(); const list = document.getElementById('reviews-list'); if (reviews.length === 0) { list.innerHTML = '<li class="no-reviews">No reviews yet. Be the first to review!</li>'; return; } list.innerHTML = reviews.map(r => ` <li class="review-item"> <div class="review-meta"> <span class="review-author">${r.author_name}</span> <span class="review-date">${new Date(r.created_at).toLocaleDateString()}</span> </div> <div class="stars">${'โ˜…'.repeat(r.rating || 5)}${'โ˜†'.repeat(5 - (r.rating || 5))}</div> <p class="review-content">${r.content}</p> </li> `).join(''); // Update comments count document.getElementById('comments-count').textContent = reviews.length; document.getElementById('total-reviews').textContent = `${reviews.length} reviews`; } catch (err) { console.error('Failed to load reviews:', err); } } // Submit review async function submitReview() { const name = document.getElementById('review-name').value.trim(); const email = document.getElementById('review-email').value.trim(); const content = document.getElementById('review-content').value.trim(); if (!name || !content) { alert('Please fill in your name and review'); return; } if (selectedRating === 0) { alert('Please select a star rating'); return; } try { await fetch(`${API_URL}/api/skills/${SKILL_SLUG}/comments`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ author_name: name, author_email: email, content: content, rating: selectedRating }) }); alert('Review submitted! Thank you.'); document.getElementById('review-name').value = ''; document.getElementById('review-email').value = ''; document.getElementById('review-content').value = ''; selectedRating = 0; updateStars(document.getElementById('star-input'), 0); loadReviews(); } catch (err) { console.error('Failed to submit review:', err); alert('Failed to submit review'); } } // Download skill function downloadSkill() { fetch('/skills/' + SKILL_SLUG + '.md') .then(response => response.text()) .then(content => { const blob = new Blob([content], { type: 'text/markdown' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = SKILL_SLUG + '.md'; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(link.href); }) .catch(err => { console.error('Download failed:', err); alert('Failed to download SKILL.md'); }); } // Hide loading overlay when page is ready function hideLoading() { const loadingOverlay = document.getElementById('loadingOverlay'); if (loadingOverlay) { loadingOverlay.classList.add('hidden'); } } // Initialize window.addEventListener('DOMContentLoaded', () => { loadReviews(); // Hide loading after a short delay to ensure content is rendered setTimeout(hideLoading, 300); }); </script> </body> </html>