{"id":319875,"date":"2026-06-25T15:42:40","date_gmt":"2026-06-25T15:42:40","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/linkdigest\/"},"modified":"2026-06-25T15:42:18","modified_gmt":"2026-06-25T15:42:18","slug":"lynx-journal","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/lynx-journal\/","author":11961,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"LynxJournal","header_author":"latz","header_description":"Save and publish links to your blog","assets_banners_color":"3e4a50","last_updated":"2026-06-25 15:42:18","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":34,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"Latz","date":"2026-06-25 15:42:18"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3586343,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[262246],"plugin_tags":[410,5331,175,128411],"plugin_category":[],"plugin_contributors":[86720],"plugin_business_model":[],"class_list":["post-319875","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-blogging","plugin_tags-curation","plugin_tags-links","plugin_tags-roundup","plugin_contributors-latz","plugin_committers-latz"],"banners":{"banner":"https:\/\/ps.w.org\/lynx-journal\/assets\/banner-772x250.png?rev=3586343","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/lynx-journal_3e4a50.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>LynxJournal is a WordPress plugin for managing and publishing curated link digests. Save interesting links, organise them by category, and publish them as blog post digests.<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Save links with title, URL, description, categories, and tags<\/li>\n<li>Organise links by category (inspired by frankysnotes.com)<\/li>\n<li>REST API for integration with browser extensions<\/li>\n<li>Schedule automatic roundup publishing (daily, weekly, monthly, or by count\/age)<\/li>\n<li>Chrome extension support<\/li>\n<\/ul>\n\n<h3>Usage<\/h3>\n\n<h3>Dashboard<\/h3>\n\n<p>The LynxJournal dashboard (LynxJournal \u203a Dashboard) gives you an at-a-glance overview:<\/p>\n\n<ul>\n<li><strong>Stats bar<\/strong> \u2014 total links, categories, published, and unpublished counts<\/li>\n<li><strong>Quick Add<\/strong> \u2014 enter a title and URL to save a link in seconds without leaving the dashboard<\/li>\n<li><strong>Recent Unpublished<\/strong> \u2014 the last five unsaved links; delete any of them directly from this list<\/li>\n<li><strong>Recently Published<\/strong> \u2014 the last five published roundup posts with their status<\/li>\n<\/ul>\n\n<h3>Adding Links<\/h3>\n\n<p><strong>Manually (full form):<\/strong> Go to LynxJournal \u203a Add Link. Fill in:<\/p>\n\n<ul>\n<li>Title (required)<\/li>\n<li>URL<\/li>\n<li>Description (rich text)<\/li>\n<li>Categories \u2014 assign to one or more existing categories<\/li>\n<li>Tags \u2014 comma-separated keywords<\/li>\n<\/ul>\n\n<p><strong>Quick add:<\/strong> Use the Quick Add box on the Dashboard for a bare-minimum title + URL entry.<\/p>\n\n<p><strong>Via Chrome extension:<\/strong> Browse to any page and click the extension icon. The title and URL are pre-filled; add a description, pick a category, and click Save Link.<\/p>\n\n<h3>Managing Links<\/h3>\n\n<p>LynxJournal \u203a All Links shows every saved link in a table:<\/p>\n\n<ul>\n<li><strong>Status badges<\/strong> \u2014 Unpublished, Draft, or Published<\/li>\n<li><strong>Publish<\/strong> \u2014 creates a WordPress post immediately for that single link<\/li>\n<li><strong>Delete<\/strong> \u2014 removes the link permanently (shows an inline confirmation first)<\/li>\n<\/ul>\n\n<h3>Publishing<\/h3>\n\n<p><strong>Individual post:<\/strong> Click Publish on any link in All Links. A new WordPress post is created with the link's title, description, and a \"Read more\" link to the source URL.<\/p>\n\n<p><strong>Roundup post:<\/strong> Click Publish on the Dashboard. All unpublished links are bundled into one post, grouped by category. Enter a custom title or leave the default (\"Links Roundup \u2013 [date]\"). Choose to publish immediately or save as draft.<\/p>\n\n<p>Both flows support draft mode \u2014 use the Draft toggle before confirming.<\/p>\n\n<h3>Scheduling<\/h3>\n\n<p>LynxJournal \u203a Schedule lets automatic roundup publishing run without manual action. Open <strong>LynxJournal \u203a Schedule<\/strong>, choose a mode, set at least one Execution Time, and click <strong>Save Schedule<\/strong>. The next time that moment arrives, LynxJournal publishes a roundup post from all unpublished links. To trigger a run immediately, use the <strong>Run Now<\/strong> button on the dashboard. To stop all automation, switch to Manual mode.<\/p>\n\n<p><strong>Modes<\/strong><\/p>\n\n<ul>\n<li><strong>Daily<\/strong> \u2014 Publishes at a fixed time every days, provided at least one unpublished link exists.<\/li>\n<li><strong>Weekly<\/strong> \u2014 Publishes on specific days of the week. Toggle any combination of Mon\u2013Sun. At least one day must be selected.<\/li>\n<li><strong>Monthly<\/strong> \u2014 Publishes on dates you define, every month. Each \"day entry\" is either a fixed calendar day (1\u201331) or an ordinal weekday (\"the first Monday\"). Multiple entries produce multiple runs per month. If a month is shorter than the configured day (e.g. 31st in a 30-day month), that entry is skipped for that month.<\/li>\n<li><strong>By Count<\/strong> \u2014 Publishes when the number of unpublished links reaches or exceeds a threshold. The check runs at every configured execution time.<\/li>\n<li><strong>By Age<\/strong> \u2014 Publishes when the oldest unpublished link is older than N days. The check runs at every configured execution time.<\/li>\n<li><strong>Manual<\/strong> \u2014 Disables all automatic publishing. Use <strong>Run Now<\/strong> or the dashboard Publish form to publish on demand.<\/li>\n<\/ul>\n\n<p><strong>Execution Times<\/strong><\/p>\n\n<p>Applies to all modes except Manual. Specify one or more 24-hour times (HH:MM) at which the scheduler wakes up. Click <strong>+ Add time<\/strong> to add a row; click <strong>\u2715<\/strong> to remove one. At least one time must remain. Duplicate values are rejected on save. Adding multiple times means the scheduler can publish more than once per day.<\/p>\n\n<p><strong>Previewing upcoming runs<\/strong><\/p>\n\n<p>In Daily, Weekly, and Monthly modes the <strong>Next 10 Schedules<\/strong> sidebar panel lists the next ten wake-up dates based on your current (unsaved) settings. Use it to verify your recurrence pattern before saving.<\/p>\n\n<p><strong>Saving the schedule<\/strong><\/p>\n\n<p>Click <strong>Save Schedule<\/strong> at the bottom of the settings column. On save, any previously pending cron event is cancelled and a new one is scheduled for the next matching time.<\/p>\n\n<p><strong>Running the schedule immediately<\/strong><\/p>\n\n<p>The <strong>Run Now<\/strong> button on the LynxJournal dashboard triggers an immediate publish run. It respects the same publish condition as the automatic schedule. In every mode, the run is silently skipped when there are no unpublished links \u2014 no empty roundup is ever created. The automatic schedule is unaffected.<\/p>\n\n<p><strong>What a roundup post looks like<\/strong><\/p>\n\n<p>Each run creates one WordPress post titled <code>Links: [Full Date]<\/code> (e.g. <code>Links: April 28, 2026<\/code>), published immediately as a standard post. The body contains one section per category, each with a list of links. Each link shows its title (linked to the saved URL, opening in a new tab) and, optionally, a description below it. Uncategorised links appear in their own section at the end. Every included link is marked as published and excluded from future digests.<\/p>\n\n<p><strong>Edge cases and caveats<\/strong><\/p>\n\n<ul>\n<li><strong>WP-Cron timing<\/strong> \u2014 WordPress's built-in cron fires when a visitor loads a page. On low-traffic sites, the actual run may be a few minutes late. For precise timing, set up a real system cron job (see Server-side cron setup below).<\/li>\n<li><strong>Timezone and DST<\/strong> \u2014 Execution times use your WordPress site timezone (Settings \u203a General \u203a Timezone). On daylight-saving transitions, spring-forward runs may be delayed by ~1 hour; fall-back runs fire once at the first occurrence of the repeated local time.<\/li>\n<li><strong>Backfill after downtime<\/strong> \u2014 Missed events are not backfilled. As soon as WordPress runs again, a single catch-up run executes and the next slot is computed from the current time. Use <strong>Run Now<\/strong> to force a catch-up immediately.<\/li>\n<li><strong>Deactivating the plugin<\/strong> \u2014 Deactivation automatically cancels any pending cron event. No event is re-registered until you save the schedule again after reactivation.<\/li>\n<li><strong>Uninstalling the plugin<\/strong> \u2014 Uninstall does not delete saved links or the <code>lynxjournal_schedule<\/code> option. To clean up, run <code>wp option delete lynxjournal_schedule<\/code> before reinstalling.<\/li>\n<\/ul>\n\n<p><strong>Server-side cron setup<\/strong><\/p>\n\n<p>WP-Cron only fires when a visitor hits the site. For reliable scheduling:<\/p>\n\n<ol>\n<li>Disable WP-Cron in <code>wp-config.php<\/code>: <code>define( 'DISABLE_WP_CRON', true );<\/code><\/li>\n<li><p>Add a system cron entry that runs every minute:<\/p>\n\n<ul>\n<li>\n<ul>\n<li>\n<ul>\n<li>\n<ul>\n<li>\n<ul>\n<li>curl -sS https:\/\/example.com\/wp-cron.php?doing_wp_cron &gt; \/dev\/null 2&gt;&amp;1<\/li>\n<\/ul><\/li>\n<\/ul><\/li>\n<\/ul><\/li>\n<\/ul><\/li>\n<\/ul>\n\n<p>Or with WP-CLI: <code>* * * * * cd \/path\/to\/wordpress &amp;&amp; wp cron event run --due-now &gt; \/dev\/null 2&gt;&amp;1<\/code><\/p><\/li>\n<\/ol>\n\n<p><strong>WP-CLI usage<\/strong><\/p>\n\n<p>LynxJournal does not register custom WP-CLI commands, but the standard cron commands work:<\/p>\n\n<ul>\n<li><code>wp cron event list | grep lynxjournal<\/code> \u2014 list pending LynxJournal cron events<\/li>\n<li><code>wp cron event run lynxjournal_execute_schedule<\/code> \u2014 force an immediate run (equivalent to Run Now)<\/li>\n<li><code>wp option get lynxjournal_schedule --format=json<\/code> \u2014 inspect the saved schedule<\/li>\n<li><code>wp option delete lynxjournal_schedule<\/code> \u2014 delete the schedule configuration<\/li>\n<\/ul>\n\n<p><strong>Logging and observability<\/strong><\/p>\n\n<p>The scheduler does not write to a custom log. To verify a run happened, check: Posts \u203a All Posts (a new \"Links: \u2026\" post appears on each successful run); the WP Crontrol plugin; or <code>wp cron event list<\/code> for the next-scheduled timestamp. The <strong>Next 10 Schedules<\/strong> panel on the Schedule page shows upcoming times for time-based modes.<\/p>\n\n<p><strong>Capabilities<\/strong><\/p>\n\n<p>Viewing the Schedule page, saving the schedule, and triggering Run Now all require the <code>manage_options<\/code> capability (administrator role by default). To delegate to other roles, grant the capability using a tool such as the User Role Editor plugin or <code>add_cap()<\/code> in your own code.<\/p>\n\n<h3>Chrome Extension<\/h3>\n\n<ol>\n<li>install the Chrome Extension \"LynxJournal\" from https:\/\/chromewebstore.google.com\/detail\/link-digest\/majjnembpebmpoaeoildijhhgbjfgjmn<\/li>\n<li>In WordPress, go to LynxJournal \u203a Settings, generate an API key, and copy the API Endpoint URL and key<\/li>\n<li>Click the extension icon \u203a <strong>Settings<\/strong>, paste both values, and save<\/li>\n<li>From now on, click the extension icon on any page to save the current URL directly to your WordPress site<\/li>\n<\/ol>\n\n<h3>Source Code &amp; Build Tools<\/h3>\n\n<p>The production JavaScript assets in <code>schedule\/schedule.js<\/code> are compiled from React components. \nThe unminified source code, build scripts, and configuration files are publicly maintained at:\nhttps:\/\/github.com\/Latz\/lynxjournal<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to the <code>\/wp-content\/plugins\/lynxjournal<\/code> directory, or install the plugin through the WordPress plugins screen directly.<\/li>\n<li>Activate the plugin through the 'Plugins' screen in WordPress.<\/li>\n<li>Use the LynxJournal menu in the admin dashboard to start adding links.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Save and publish curated link digests to your blog.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/319875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=319875"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/latz"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=319875"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=319875"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=319875"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=319875"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=319875"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=319875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}