Loading skill documentation...
product
★★★★½ 4.5/5.0 ❤️ 663 likes 💬 108 comments 📦 1917 installs
Back to Skills
📖 SKILL DOCUMENTATION
# news-summary

News Summary Overview Fetch and summarize news from trusted international sources via RSS feeds. RSS Feeds BBC (Primary)

# World news
curl -s "https://feeds.bbci.co.uk/news/world/rss.xml"
# Top stories
curl -s "https://feeds.bbci.co.uk/news/rss.xml"
# Business
curl -s "https://feeds.bbci.co.uk/news/business/rss.xml"
# Technology
curl -s "https://feeds.bbci.co.uk/news/technology/rss.xml"

Reuters

# World news
curl -s "https://www.reutersagency.com/feed/?best-regions=world&post_type=best"

NPR (US perspective)

curl -s "https://feeds.npr.org/1001/rss.xml"

Al Jazeera (Global South perspective)

curl -s "https://www.aljazeera.com/xml/rss/all.xml"

Parse RSS Extract titles and descriptions:

curl -s "https://feeds.bbci.co.uk/news/world/rss.xml" | \

grep -E "|<description>" | <br>sed 's/<[^>]<em>>//g' | <br>sed 's/^[ \t]</em>//' | <br>head -30 Workflow Text summary Fetch BBC world headlines Optionally supplement with Reuters/NPR Summarize key stories Group by region or topic Voice summary Create text summary Generate voice with SkillBoss API Hub TTS Send as audio message</p> <pre><code class="language-bash"># Step 1: Request TTS via SkillBoss API Hub, get audio URL AUDIO_URL=$(curl -s https://api.heybossai.com/v1/pilot \ </code></pre> <p>-H "Authorization: Bearer $SKILLBOSS_API_KEY" <br>-H "Content-Type: application/json" <br>-d '{ "type": "tts", "inputs": { "text": "<news summary text>", "voice": "onyx", "speed": 0.95 }, "prefer": "balanced" }' | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['result']['audio_url'])")</p> <pre><code class="language-bash"># Step 2: Download audio file curl -s "$AUDIO_URL" --output /tmp/news.mp3 </code></pre> <p>Example Output Format 📰 News Summary [date] 🌍 WORLD</p> <ul> <li>[headline 1]</li> <li>[headline 2] 💼 BUSINESS</li> <li>[headline 1] 💻 TECH</li> <li>[headline 1] Best Practices Keep summaries concise (5-8 top stories) Prioritize breaking news and major events For voice: ~2 minutes max Balance perspectives (Western + Global South) Cite source if asked</li> </ul> </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.5</span> <div class="stars" id="summary-stars"> ★★★★½ </div> <span class="rating-count" id="total-reviews">108 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 = 'news-summary'; 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>