{"id":2416,"date":"2026-02-03T22:48:16","date_gmt":"2026-02-03T22:48:16","guid":{"rendered":"https:\/\/www.danielpradilla.info\/blog\/?p=2416"},"modified":"2026-03-27T09:44:55","modified_gmt":"2026-03-27T09:44:55","slug":"echotree","status":"publish","type":"post","link":"https:\/\/www.danielpradilla.info\/blog\/echotree\/","title":{"rendered":"EchoTree"},"content":{"rendered":"<p>For years now I kept some of my social accounts alive with a Python script. It read from a collection of RSS feeds and shared at random times. It worked, my feeds stayed active, and people asked me what was I doing reading at 3am.<\/p>\n<p>The script had a bit of personality: it logged out all the time, and tended to share links as simple URLs, no preview. There was no context, no personal take, no small comment that explains why I was sharing this. Although I liked the serendipity of it, whenever I found a really cool article, I preferred to take the long route and curate the post by hand.<\/p>\n<p>I tried Buffer and a few similar tools, but they felt extravagant for something I only do now and then. I don&#8217;t share articles for a living, I share them because I believe in elective affinities, that quiet collective pull toward certain ideas. A piece of writing isn&#8217;t fully alive until it&#8217;s passed from hand to hand. Unshared, it feels like the proverbial tree falling in a forest with no one around to hear it.<\/p>\n<p>So I built EchoTree.<\/p>\n<p>What I like most about it is that it feels proportionate: no subscription tax, no heavy setup, no pressure to become a &#8220;content machine.&#8221; It&#8217;s just a private tool I control, built for thoughtful sharing.<\/p>\n<h2>The goal<\/h2>\n<p>I wanted a light, intentional workflow:<\/p>\n<ul>\n<li>read the article in a clean view,<\/li>\n<li>pick a sentence or summary,<\/li>\n<li>write a short comment,<\/li>\n<li>and share now (or schedule).<\/li>\n<\/ul>\n<p>That meant building:<\/p>\n<ul>\n<li>a reader mode preview,<\/li>\n<li>a comment box with a quick summary helper,<\/li>\n<li>a share-now button,<\/li>\n<li>a queue for when I want to schedule.<\/li>\n<\/ul>\n<h2>What makes it different (for me)<\/h2>\n<ul>\n<li>Reader and publishing flow in one place.<\/li>\n<li>Works across X, LinkedIn, Mastodon, and Bluesky.<\/li>\n<li>I can share any URL, not only feed items.<\/li>\n<li>AI helps draft summaries\/comments, but I always decide what actually gets posted.<\/li>\n<\/ul>\n<p>The scheduled queue ended up being one of my favorite parts: before a post goes out, I can still edit the comment, adjust the time, or switch the networks it will be sent to.<\/p>\n<p>Compared with paid schedulers, EchoTree is intentionally narrower: self-hosted, simpler, and closer to how I actually share things.<\/p>\n<h2>How I built it<\/h2>\n<ul>\n<li>PHP + Slim for routing and pages.<\/li>\n<li>Twig for templates.<\/li>\n<li>SQLite so it runs anywhere without setup.<\/li>\n<li>SimplePie + Readability for feeds and reader mode.<\/li>\n<\/ul>\n<p>I used <a href=\"https:\/\/openclaw.ai\">OpenClaw<\/a> (when it was called ClawdBot) over WhatsApp while at the gym, which felt very 2026.<\/p>\n<p>Codex 5.2 was behind the scenes. One strategy that worked extremely well was to draft together one Specs and one Tasks document. Specs provided the business needs and Tasks supplied discrete steps to build the application.<\/p>\n<p>Then I wrote &#8220;read the specs and implement the tasks one step at a time&#8221; and the thing did like 3 days of work in 5 minutes. I&#8217;d say the initial product was like 80% finished.<\/p>\n<p>The whole thing lives in a folder and doesn&#8217;t need a database server or a queue.<\/p>\n<p>You can find it at <a href=\"https:\/\/github.com\/danielpradilla\/echotree\">https:\/\/github.com\/danielpradilla\/echotree<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For years now I kept some of my social accounts alive with a Python script. It read from a collection of RSS feeds and shared at random times. It worked, my feeds stayed active, and people asked me what was I doing reading at 3am. The script had a bit of personality: it logged out&hellip; <a class=\"more-link\" href=\"https:\/\/www.danielpradilla.info\/blog\/echotree\/\">Continue reading <span class=\"screen-reader-text\">EchoTree<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":2417,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[174,170,331],"tags":[],"class_list":["post-2416","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bestof","category-socialmedia","category-software-development-en-en","entry"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2026\/02\/echotree.jpg","jetpack_shortlink":"https:\/\/wp.me\/s1tlzy-echotree","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":2212,"url":"https:\/\/www.danielpradilla.info\/blog\/linear-optimization-with-or-tools-building-a-web-front-end-with-falcon-and-gunicorn\/","url_meta":{"origin":2416,"position":0},"title":"Linear Optimization with or-tools \u00e2\u20ac\u201d building a web front-end with falcon and gunicorn","author":"Daniel Pradilla","date":"14\/11\/2017","format":false,"excerpt":"In a previous post, I put together a script for solving a linear optimisation problem using Google's OR-tools. This python script is callable from the command line and you kinda need to know what you are doing and how to organize the parameters. So, in order to address this difficulty,\u2026","rel":"","context":"In &quot;Software Dev.&quot;","block_context":{"text":"Software Dev.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/software-development-en-en\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2017\/11\/groceryshopping.gif?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2017\/11\/groceryshopping.gif?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2017\/11\/groceryshopping.gif?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2017\/11\/groceryshopping.gif?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":2300,"url":"https:\/\/www.danielpradilla.info\/blog\/uploading-and-downloading-documents-from-amazon-s3-using-bash\/","url_meta":{"origin":2416,"position":1},"title":"Uploading and downloading documents from Amazon S3 using bash","author":"Daniel Pradilla","date":"12\/12\/2018","format":false,"excerpt":"You need to upload a file to S3 and cannot install new packages in the server, nor the s3 client tools. You only have bash, openssl and sed. Go. I found and adapted a script by\u00a0Viktor Szakats, that creates all the proper headers expected by the latest AWS API. I\u2026","rel":"","context":"In &quot;Software Dev.&quot;","block_context":{"text":"Software Dev.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/software-development-en-en\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2224,"url":"https:\/\/www.danielpradilla.info\/blog\/pentaho-is-slow-for-servers-with-too-many-home-directories\/","url_meta":{"origin":2416,"position":2},"title":"Pentaho is slow for servers with too many home directories","author":"Daniel Pradilla","date":"28\/04\/2018","format":false,"excerpt":"Over the course of two years, browsing solutions on our Pentaho 5.4 server became progressively slow. It came to a point in which you had to wait 2-3 minutes to see the list of solutions in the Pentaho User Console. The catalina log didn't say much and we didn't have\u2026","rel":"","context":"In &quot;Software Dev.&quot;","block_context":{"text":"Software Dev.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/software-development-en-en\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1943,"url":"https:\/\/www.danielpradilla.info\/blog\/organize-dropbox\/","url_meta":{"origin":2416,"position":3},"title":"How to Keep your Dropbox Organized","author":"Daniel Pradilla","date":"21\/03\/2013","format":false,"excerpt":"A while ago I wrote about how Dropbox can be a tool to organize your life. One of the secondary benefits of Dropbox is that you can share folders with other people to exchange files in a transparent way. The problem is that if you share Dropbox folders with several\u2026","rel":"","context":"In &quot;Lifestyle&quot;","block_context":{"text":"Lifestyle","link":"https:\/\/www.danielpradilla.info\/blog\/category\/lifestyle\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2011\/09\/3367971-12637982-thumbnail.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2229,"url":"https:\/\/www.danielpradilla.info\/blog\/linear-optimization-with-or-tools-containerizing-a-gunicorn-web-application\/","url_meta":{"origin":2416,"position":4},"title":"Linear optimization with or-tools: containerizing a gunicorn web application","author":"Daniel Pradilla","date":"15\/05\/2018","format":false,"excerpt":"Previously, we left our app working with our local python+gunicorn+nginx installation. In order to get there we had to do quite a bit of configuration and if we wanted to deploy this in a server or send it to a friend, we would have to go through a very error-prone\u2026","rel":"","context":"In &quot;Software Dev.&quot;","block_context":{"text":"Software Dev.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/software-development-en-en\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2018\/05\/docker.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2018\/05\/docker.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2018\/05\/docker.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1914,"url":"https:\/\/www.danielpradilla.info\/blog\/4-ways-of-getting-the-most-out-of-your-dropbox\/","url_meta":{"origin":2416,"position":5},"title":"4 ways of getting the most out of your dropbox","author":"Daniel Pradilla","date":"04\/02\/2013","format":false,"excerpt":"Dropbox is one of my essential tools.\u00a0If you already have it, I've got 4 ways of using it that you may not know about: \u00a0 1.\u00a0Upload files via email Send To Dropbox\u00a0is a service that assigns you an email address linked to your Dropbox. Everything that you send or forward\u2026","rel":"","context":"In &quot;Project Mgmt.&quot;","block_context":{"text":"Project Mgmt.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/projectmanagement-en\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2012\/01\/dropbox_logo.png?resize=350%2C200","width":350,"height":200},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/posts\/2416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/comments?post=2416"}],"version-history":[{"count":0,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/posts\/2416\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/media\/2417"}],"wp:attachment":[{"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/media?parent=2416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/categories?post=2416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/tags?post=2416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}