{"id":320994,"date":"2026-07-24T13:32:50","date_gmt":"2026-07-24T13:32:50","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/partyline\/"},"modified":"2026-07-24T13:32:27","modified_gmt":"2026-07-24T13:32:27","slug":"partyline","status":"publish","type":"plugin","link":"https:\/\/en-ca.wordpress.org\/plugins\/partyline\/","author":10481546,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.0","stable_tag":"1.3.0","tested":"7.0.2","requires":"5.0","requires_php":"","requires_plugins":null,"header_name":"Partyline","header_author":"Kenny Katzgrau","header_description":"Listens for a webhook callback from Twilio, reformats the body via ChatGPT, and saves it as a WordPress draft.","assets_banners_color":"40307f","last_updated":"2026-07-24 13:32:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/broadstreetads\/partyline","header_author_uri":"https:\/\/broadstreetads.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":50,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.0":{"tag":"1.3.0","author":"broadstreetads","date":"2026-07-24 13:32:27"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3621354,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3621354,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3621354,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3621354,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The Partyline settings page.","2":"The Partyliners management screen.","3":"The user profile page with the \"Partyline Phone Number\" field.","4":"An example of a post created by Partyline."}},"plugin_section":[],"plugin_tags":[2353,2316,176919,711,13887],"plugin_category":[41,44],"plugin_contributors":[273168,89149],"plugin_business_model":[],"class_list":["post-320994","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-community","plugin_tags-local-news","plugin_tags-sms","plugin_tags-user-generated-content","plugin_category-communication","plugin_category-discussion-and-community","plugin_contributors-broadstreetads","plugin_contributors-katzgrau","plugin_committers-broadstreetads"],"banners":{"banner":"https:\/\/ps.w.org\/partyline\/assets\/banner-772x250.png?rev=3621354","banner_2x":"https:\/\/ps.w.org\/partyline\/assets\/banner-1544x500.png?rev=3621354","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/partyline\/assets\/icon-128x128.png?rev=3621354","icon_2x":"https:\/\/ps.w.org\/partyline\/assets\/icon-256x256.png?rev=3621354","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Partyline is a WordPress plugin that lets anyone in your community send in a story, a tip, a moment, or just a cute dog photo. They can submit right from an installable app on their phone, or by text message via Twilio. Partyline optionally gives submissions a quick AI polish using OpenAI, and creates a draft post in your WordPress dashboard for you to review.<\/p>\n\n<p>It\u2019s the fastest way to turn real, spontaneous contributions into published content. Whether it\u2019s breaking news or just something unexpected and delightful, Partyline brings your readers into the newsroom.<\/p>\n\n<p>Made for local publishers who are short on time but big on community.<\/p>\n\n<p><strong>Top 10 Uses for Partyline<\/strong>\n<em>A lovingly curated list from experience, originally shared with LINA Publishers in Australia<\/em><\/p>\n\n<ol>\n<li><strong>Cover stories you'd never get to otherwise<\/strong>, like proms, graduations, and scout ceremonies.<\/li>\n<li><strong>Post ridiculous stuff that wouldn\u2019t fly as a \u201creal\u201d article<\/strong>, and watch the traffic surprise you.<\/li>\n<li><strong>File an initial post when a breaking story hits<\/strong>, straight from the street.<\/li>\n<li><strong>Capture the in-the-moment energy<\/strong> of a parade, protest, or town meeting.<\/li>\n<li><strong>Share sunsets and puppy pics<\/strong>, without feeling like a complete sellout.<\/li>\n<li><strong>Keep your advertisers happy<\/strong> by actually posting their community event (and looking cool doing it).<\/li>\n<li><strong>Turn your readers into local mini-celebrities<\/strong>, and spark conversations offline.<\/li>\n<li><strong>Give voice to people who never get quoted.<\/strong> Partyline lowers the barrier to entry.<\/li>\n<li><strong>Redirect PR people<\/strong> to a more productive outlet than your inbox.<\/li>\n<li><strong>Reclaim your newsroom\u2019s social media power<\/strong>, because you were doing it before Facebook anyway.<\/li>\n<\/ol>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the following third-party services. None of them are contacted until you configure the corresponding credentials on the Partyline settings page.<\/p>\n\n<p><strong>Twilio<\/strong><\/p>\n\n<p>Used to receive SMS submissions from your community and to download any media (photos) attached to those messages.<\/p>\n\n<ul>\n<li>What is sent: when Twilio POSTs an inbound SMS to your site's webhook URL, the plugin reads the message body, sender phone number, recipient phone number, and any attached media URLs. To fetch authenticated media files, the plugin makes outbound HTTPS requests to <code>api.twilio.com<\/code> (and to the redirected media CDN URLs Twilio returns) using your Twilio Account SID and Auth Token.<\/li>\n<li>When it is sent: only when an SMS is received at the configured webhook URL and the message includes media attachments.<\/li>\n<li>Service: Twilio, Inc. Terms of Service: https:\/\/www.twilio.com\/legal\/tos . Privacy Policy: https:\/\/www.twilio.com\/legal\/privacy .<\/li>\n<\/ul>\n\n<p><strong>OpenAI (ChatGPT)<\/strong><\/p>\n\n<p>Optional. Used to clean up spelling\/grammar of submitted messages, generate post titles, and (in the app) transcribe voice dictation and draft a title and blurb.<\/p>\n\n<ul>\n<li>What is sent: the text of a submission (from SMS or the app), plus a short instruction prompt, are sent to <code>https:\/\/api.openai.com\/v1\/chat\/completions<\/code>. In the app, voice recordings are sent to <code>https:\/\/api.openai.com\/v1\/audio\/transcriptions<\/code> (Whisper) to transcribe them, and the submitted photo may be included so the model can draft a fitting title and blurb. All requests use the OpenAI API key you configure.<\/li>\n<li>When it is sent: only if you have entered an OpenAI API key in the Partyline settings, and only at the moment a submission is being processed into a draft post.<\/li>\n<li>Service: OpenAI, L.L.C. Terms of Use: https:\/\/openai.com\/policies\/terms-of-use . Privacy Policy: https:\/\/openai.com\/policies\/privacy-policy .<\/li>\n<\/ul>\n\n<p><strong>Cloudflare Turnstile<\/strong><\/p>\n\n<p>Optional. Used to verify that anonymous submissions and public applications come from a real person rather than a bot.<\/p>\n\n<ul>\n<li>What is sent: when you configure a Turnstile site key, the public submission and application forms load Cloudflare's widget script from <code>https:\/\/challenges.cloudflare.com<\/code>, and the visitor's browser obtains a token. On submission, that token is sent to your server and verified against <code>https:\/\/challenges.cloudflare.com\/turnstile\/v0\/siteverify<\/code> using your Turnstile secret key.<\/li>\n<li>When it is sent: only if you have entered a Turnstile site key in the settings, and only on the public submission or application forms. Without a key, a built-in math challenge is used instead and no third party is contacted.<\/li>\n<li>Service: Cloudflare, Inc. Terms: https:\/\/www.cloudflare.com\/website-terms\/ . Privacy Policy: https:\/\/www.cloudflare.com\/privacypolicy\/ .<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>partyline<\/code> directory to your <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Go to the Partyline settings page. The contributor app is enabled by default at <code>your-site.com\/partyline<\/code>; share that link with your community.<\/li>\n<li>(Optional) To also accept submissions by text message, enable Twilio in the settings, add your credentials, and point your Twilio number's messaging webhook at the URL shown there.<\/li>\n<li>(Optional) Add an OpenAI API key to enable AI cleanup and voice dictation.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20do%20i%20need%20to%20use%20partyline%3F\"><h3>What do I need to use Partyline?<\/h3><\/dt>\n<dd><p>Nothing. The contributor app is enabled by default, so your community can start submitting right away. Twilio and ChatGPT are optional add-ons, not requirements:<\/p>\n\n<ul>\n<li><strong>Twilio (Optional)<\/strong>: a <a href=\"https:\/\/www.twilio.com\/\">Twilio<\/a> account and an SMS-capable phone number, to also accept submissions by text.<\/li>\n<li><strong>ChatGPT \/ OpenAI (Optional)<\/strong>: an <a href=\"https:\/\/platform.openai.com\/account\/api-keys\">OpenAI API key<\/a>, to auto-correct grammar and spelling and power voice dictation in the app.<\/li>\n<\/ul><\/dd>\n<dt id=\"how%20do%20i%20manage%20partyliners%3F\"><h3>How do I manage Partyliners?<\/h3><\/dt>\n<dd><p>A Partyliner is a WordPress user with a phone number, which is how a text message is matched back to their account. To manage them, go to <strong>Partyline &gt; Partyliners<\/strong> in your admin menu. There you can see everyone at a glance and add a Partyliner directly (name, phone, email).<\/p>\n\n<p>You can also turn on <strong>public applications<\/strong> in the settings so readers can apply. Either way, a Partyliner's phone number is stored in the format <code>+15555555555<\/code> (you can still set it on the standard WordPress user profile too).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>FEATURE: Contributor app (PWA), an installable web app where people submit a photo and a story from their phone; now the primary way to collect Partylines, with SMS\/Twilio as an optional secondary channel<\/li>\n<li>FEATURE: Multiple photos per Partyline in the app; the first is the cover (featured image), and the AI write-up looks at the cover photo<\/li>\n<li>FEATURE: Optional anonymous submissions, protected by a built-in math challenge and honeypot (with optional Cloudflare Turnstile for stronger protection)<\/li>\n<li>FEATURE: Optional voice dictation (OpenAI Whisper) and an AI write-up of the photo and story in the app<\/li>\n<li>FEATURE: Public \"apply to be a Partyliner\" page (confirmed by email) plus a dedicated Partyline &gt; Partyliners management screen<\/li>\n<li>FEATURE: New Partyliners get a welcome email with how-to instructions; hand-added Partyliners get a link to set their password, and admins can resend one from the Partyliners screen<\/li>\n<li>FEATURE: When a Partyline is published, it is attributed to the registered Partyliner and they are emailed that it is live<\/li>\n<li>ENHANCEMENT: Phone numbers are normalized to E.164 so text messages reliably match a Partyliner<\/li>\n<li>ENHANCEMENT: Redesigned admin screens and an in-plugin How-To guide<\/li>\n<li>ENHANCEMENT: The app title, home-screen text, and icon follow your site (site title and Site Icon)<\/li>\n<li>ENHANCEMENT: Refreshed the plugin icon and banner<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>ENHANCEMENT: Removed the unused bundled Broadstreet API client (eliminates direct cURL usage and <code>Broadstreet*<\/code> class names)<\/li>\n<li>ENHANCEMENT: Removed redundant <code>wp-admin\/includes\/*<\/code> requires from the Twilio webhook handler \u2014 the sideload helper loads what it needs<\/li>\n<li>ENHANCEMENT: Renamed the <code>has_partyline_phone<\/code> query var to <code>partyline_has_phone<\/code> so the prefix leads<\/li>\n<li>ENHANCEMENT: Dropped the Broadstreet entry from the External services section of the readme<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>SECURITY: Settings AJAX endpoint now verifies a WordPress nonce, requires <code>manage_options<\/code>, and sanitizes every field before saving<\/li>\n<li>ENHANCEMENT: Moved inline admin scripts and styles into enqueued assets; settings page now bootstraps via <code>wp_localize_script<\/code><\/li>\n<li>ENHANCEMENT: Bundled the Partyline menu icon locally instead of loading it from an external S3 URL<\/li>\n<li>ENHANCEMENT: Documented Twilio, OpenAI, and Broadstreet as external services in the readme<\/li>\n<li>ENHANCEMENT: Updated Alpine.js to 3.15.12<\/li>\n<li>ENHANCEMENT: Moved the Partyline admin menu out of the core admin hierarchy band (position 81)<\/li>\n<li>ENHANCEMENT: Stopped writing the raw Twilio webhook body to the log file<\/li>\n<li>FIX: Readme typos<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>ENHANCEMENT: Replaced AngularJS with Alpine.js in the admin settings UI<\/li>\n<li>ENHANCEMENT: WordPress.org compliance pass \u2014 added ABSPATH guards, switched log file I\/O to WP_Filesystem and <code>wp_mkdir_p()<\/code>, replaced <code>date()<\/code> with <code>gmdate()<\/code>, prefixed globals, hardened webhook key comparison with <code>hash_equals()<\/code>, unslashed\/sanitized all <code>$_POST<\/code>\/<code>$_SERVER<\/code> input, removed debug <code>print_r()<\/code> calls<\/li>\n<li>ENHANCEMENT: Cleaned up build script to exclude dev files from the distribution zip<\/li>\n<li>ENHANCEMENT: Bumped \"Tested up to\" to 7.0<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>ENHANCEMENT: Support multiple image attachments<\/li>\n<li>ENHANCEMENT: Added fallback for Twilio images that don't require authentication<\/li>\n<li>ENHANCEMENT: Refactor code<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>ENHANCEMENT: Applied escaped outputs as per WordPress Coding Standards<\/li>\n<li>ENHANCEMENT: Tightened up enqueue scripts<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>ENHANCEMENT: Tightened up conditional checks on a number of variables<\/li>\n<li>ENHANCEMENT: Added server-side authentication to Twilio image retrieval<\/li>\n<li>ENHANCEMENT: Added Twilio-specific settings to the Admin settings page<\/li>\n<li>ENHANCEMENT: Enabled generation of thumbnails based on Twilio-supplied image<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<\/ul>","raw_excerpt":"Local news is the original social media. Let your community share and tell its side of the story with Partyline.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/320994","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=320994"}],"author":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/broadstreetads"}],"wp:attachment":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=320994"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=320994"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=320994"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=320994"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=320994"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=320994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}