{"id":293367,"date":"2026-04-05T08:23:59","date_gmt":"2026-04-05T08:23:59","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/reading-completionist\/"},"modified":"2026-04-05T08:25:11","modified_gmt":"2026-04-05T08:25:11","slug":"lektrail-reading-tracker","status":"publish","type":"plugin","link":"https:\/\/mai.wordpress.org\/plugins\/lektrail-reading-tracker\/","author":23113524,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.0","stable_tag":"1.0.0","tested":"6.9.4","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"LekTrail Reading Tracker","header_author":"raulprdev","header_description":"Track reading progress and suggest unread posts.","assets_banners_color":"","last_updated":"2026-04-05 08:25:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":40,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"raulprdev","date":"2026-04-05 08:25:11"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3499142,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3499142,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"lektrail\/widget":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"lektrail\/widget","version":"1.0.0","title":"LekTrail Reading Tracker","category":"widgets","icon":"book-alt","description":"Display reading progress and suggestions for your visitors.","keywords":["reading","progress","tracker","suggestions"],"textdomain":"lektrail-reading-tracker","supports":{"html":false,"multiple":false,"align":["wide","full"],"color":{"background":true,"text":true},"spacing":{"padding":true,"margin":true},"typography":{"fontSize":true}},"attributes":{"maxViewed":{"type":"number"},"maxRead":{"type":"number"},"maxSuggestions":{"type":"number"},"showExcerpt":{"type":"boolean"},"showThumbnail":{"type":"boolean"},"excerptLength":{"type":"number"},"viewedEnabled":{"type":"boolean"},"completedEnabled":{"type":"boolean"},"showClearButton":{"type":"boolean"},"labelContinue":{"type":"string"},"labelCompleted":{"type":"string"},"labelSuggestions":{"type":"string"},"labelEmpty":{"type":"string"},"labelLoading":{"type":"string"},"labelClear":{"type":"string"},"suggestionOrder":{"type":"string","enum":["random","recent","related"]},"suggestionsCacheHours":{"type":"number"}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"lektrail-widget"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[307,225949,7126,36439,550],"plugin_category":[36],"plugin_contributors":[259447],"plugin_business_model":[],"class_list":["post-293367","plugin","type-plugin","status-publish","hentry","plugin_tags-engagement","plugin_tags-reading-progress","plugin_tags-recently-viewed","plugin_tags-suggestions","plugin_tags-tracking","plugin_category-analytics","plugin_contributors-raulprdev","plugin_committers-raulprdev"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/lektrail-reading-tracker\/assets\/icon-128x128.png?rev=3499142","icon_2x":"https:\/\/ps.w.org\/lektrail-reading-tracker\/assets\/icon-256x256.png?rev=3499142","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Most websites have no memory. Visitors return and see the same content with no recognition of what they've already explored. LekTrail changes that.<\/p>\n\n<p><strong>For content sites<\/strong>: Show readers which articles they started but didn't finish, and suggest new content based on their history.<\/p>\n\n<p><strong>For e-commerce<\/strong>: Display recently viewed products so customers can easily return to items they were considering.<\/p>\n\n<p><strong>For courses and documentation<\/strong>: Track progress through lessons or guides, showing what's completed and what's next.<\/p>\n\n<h4>How It Works<\/h4>\n\n<p>LekTrail tracks when visitors scroll through your content:<\/p>\n\n<ul>\n<li><strong>Viewed<\/strong>: Posts they started reading<\/li>\n<li><strong>Completed<\/strong>: Posts they scrolled to the end (configurable threshold)<\/li>\n<li><strong>Suggestions<\/strong>: Unread posts based on your configuration<\/li>\n<\/ul>\n\n<p>The widget displays three sections: \"Continue Reading\", \"Completed\", and \"Suggested Reading\".<\/p>\n\n<h4>Two Tracking Modes<\/h4>\n\n<p><strong>localStorage Mode (Default)<\/strong><\/p>\n\n<ul>\n<li>Works for all visitors, no login required<\/li>\n<li>Data stored in browser, completely private<\/li>\n<li>Optional consent banner<\/li>\n<li>Data clears if browser storage is cleared<\/li>\n<\/ul>\n\n<p><strong>Server-Side Mode<\/strong><\/p>\n\n<ul>\n<li>Requires logged-in users (WordPress users or membership plugin)<\/li>\n<li>Reading history persists across devices<\/li>\n<li>Useful for membership sites, courses, or personalized experiences<\/li>\n<li>Anonymous visitors see suggestions only<\/li>\n<\/ul>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Gutenberg block and shortcode support<\/li>\n<li>Works with any post type (posts, pages, products, custom types)<\/li>\n<li>Configurable scroll threshold to mark content as \"completed\"<\/li>\n<li>Show\/hide excerpts and thumbnails<\/li>\n<li>Suggestion order: random, recent, or related<\/li>\n<li>Category filters for suggestions<\/li>\n<li>Customizable labels (multilingual ready)<\/li>\n<li>Optional consent requirement with built-in banner<\/li>\n<li>Performance caching for suggestions<\/li>\n<\/ul>\n\n<h4>Development<\/h4>\n\n<p>Source code and build tools are available on <a href=\"https:\/\/github.com\/raulprdev\/lektrail\">GitHub<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload <code>lektrail<\/code> to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin<\/li>\n<li>Add the widget:\n\n<ul>\n<li><strong>Gutenberg<\/strong>: Search for \"LekTrail\" in the block inserter<\/li>\n<li><strong>Shortcode<\/strong>: Add <code>[lektrail]<\/code> to any page<\/li>\n<\/ul><\/li>\n<li>Configure in Settings &gt; LekTrail<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20without%20user%20registration%3F\"><h3>Does this work without user registration?<\/h3><\/dt>\n<dd><p>Yes. By default, LekTrail uses localStorage which works for all visitors without requiring login. Data is stored privately in the visitor's browser.<\/p><\/dd>\n<dt id=\"can%20i%20track%20reading%20progress%20for%20logged-in%20users%3F\"><h3>Can I track reading progress for logged-in users?<\/h3><\/dt>\n<dd><p>Yes. Enable \"Track Logged-in Users\" in settings. This stores reading history on the server, allowing it to persist across devices. Requires users to be logged in (WordPress users or via a membership plugin).<\/p><\/dd>\n<dt id=\"what%20post%20types%20can%20i%20track%3F\"><h3>What post types can I track?<\/h3><\/dt>\n<dd><p>Any post type: posts, pages, WooCommerce products, custom post types. Configure which types to track in the settings.<\/p><\/dd>\n<dt id=\"how%20do%20i%20customize%20the%20widget%20appearance%3F\"><h3>How do I customize the widget appearance?<\/h3><\/dt>\n<dd><p>The widget uses minimal styling. Add your own CSS targeting <code>.lektrail-widget<\/code>, <code>.lektrail-continue<\/code>, <code>.lektrail-completed<\/code>, and <code>.lektrail-suggestions<\/code>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>localStorage and server-side tracking modes<\/li>\n<li>Gutenberg block and shortcode<\/li>\n<li>Configurable suggestions (random, recent, related)<\/li>\n<li>Category filters<\/li>\n<li>Consent management<\/li>\n<li>Custom labels<\/li>\n<\/ul>","raw_excerpt":"Show visitors what they&#039;ve read, what they started, and what to read next.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/293367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=293367"}],"author":[{"embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/raulprdev"}],"wp:attachment":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=293367"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=293367"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=293367"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=293367"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=293367"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=293367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}