[{"data":1,"prerenderedAt":339},["ShallowReactive",2],{"/projects/ktr":3},{"id":4,"title":5,"body":6,"date":326,"description":159,"extension":327,"favorite":328,"meta":329,"navigation":328,"path":332,"seo":333,"sitemap":334,"stem":335,"tags":336,"thumbnail":337,"__hash__":338},"projects/projects/ktr.md","Keep the Rhythm",{"type":7,"value":8,"toc":320},"minimark",[9,14,41,48,51,54,57,60,79,85,87,91,98,105,111,113,117,122,125,131,134,138,141,147,153,208,214,239,243,246,252,256,259,266,277,287,291,294,300,304,306,316],[10,11,13],"h2",{"id":12},"overview","Overview",[15,16,17,18,26,27,31,32,35,36,40],"p",{},"Keep the Rhythm (KTR) is an ",[19,20,25],"a",{"href":21,"rel":22,"target":24},"https://obsidian.md/",[23],"nofollow","\\_blank","Obsidian"," plugin that helps users maintain a ",[28,29,30],"strong",{},"consistent writing practice",". With ",[28,33,34],{},"+17,000 downloads",", KTR has found success among both professional and hobbyist writers, and especially with those who ",[37,38,39],"em",{},"(like me)"," are able to make more sense of the world through typing words into a computer.",[15,42,43],{},[44,45],"img",{"alt":46,"src":47},"KTR Logo","/projects/ktr/ktr_logo.png",[15,49,50],{},"By locally tracking file changes and displaying a historical overview of your progress, KTR offers users motivation to keep consistently working on their projects. The data is mainly shown through a heatmap, but key data points (weekly, monthly, yearly stats) are also easily available, as well as complex queries for specific date ranges or file paths. The components were carefully designed to help with fast usability while also providing a minimal interface that doesn't intrude on the core experience (writing).",[15,52,53],{},"Through working on this project, I learned a lot about how to add safeguards to avoid data loss (losing your progress feels really bad), the experience of deploying something used by thousands of users, and the importance of user feedback and testing in refining a project.",[15,55,56],{},"Especially, this project expands my experiments around the idea of using precise interventions to promote critical behavioral change; through well-crafted and thoughtful interaction, a simple design solution can help people be more creative, proactive, and human.",[58,59],"br",{},[61,62,63,72],"ul",{},[64,65,66,67],"li",{},"Check the ",[19,68,71],{"href":69,"rel":70,"target":24},"https://github.com/benjaminezequiel/keep-the-rhythm",[23],"repository on Github",[64,73,74,75],{},"Get the plugin from ",[19,76,78],{"href":77,"target":24},"obsidian://show-plugin?id=keep-the-rhythm","Obsidian's Plugin Library",[15,80,81],{},[44,82],{"alt":83,"src":84},"Project Gallery","/projects/ktr/ktr_gallery.png",[58,86],{},[10,88,90],{"id":89},"the-power-of-numbers-go-up","The Power of “Numbers Go Up”",[15,92,93,94,97],{},"The motivation that comes from maintaining a 'streak' is something used by many platforms, like Duolingo and Github. KTR leverages this same strategy, exploring the ",[28,95,96],{},"feeling of satisfaction"," that comes from watching numbers increase and progress bars fill.",[15,99,100,101,104],{},"By making how much a user writes more visually apparent, the plugin incentivizes them to do it more consistently, creating a ",[28,102,103],{},"reinforcing feedback loop",". Though quantity is not the ultimate goal, small and reasonable targets allow users to adopt KTR as a source of motivation that helps them show up every day.",[15,106,107],{},[44,108],{"alt":109,"src":110},"Numbers Go Up Meme","/images/neuron_activation.jpeg",[58,112],{},[10,114,116],{"id":115},"features","Features",[118,119,121],"h4",{"id":120},"heatmap","Heatmap",[15,123,124],{},"The choice of using a heatmap is heavily inspired by Github's approach. Since many in the Obsidian community are familiar with the platform, this data visualization strategy offers a recognizable interface. Beyond familiarity, extensive customization options are available, from cell colors to shapes and progressive fill effects.",[15,126,127],{},[44,128],{"alt":129,"src":130},"Heatmap Component","/projects/ktr/ktr_heatmap.png",[15,132,133],{},"This component has been one of the main eye-catching features of the plugin, with many users citing it as a key motivation to explore the solution and integrate it into their Obsidian workspace.",[118,135,137],{"id":136},"slots","Slots",[15,139,140],{},"Different data points are available through Slots, instantiable components that allow users to easily customize their interface with common queries, like vault-wide word counts, and time-based queries for weekly, monthly, and yearly progress.",[15,142,143],{},[44,144],{"alt":145,"src":146},"Slot Component","/projects/ktr/ktr_slots.png",[15,148,149,152],{},[28,150,151],{},"Current Values",": dynamic queries calculated based on current context.",[154,155,160],"pre",{"className":156,"code":157,"language":158,"meta":159,"style":159},"language-yaml shiki shiki-themes github-light github-dark","CURRENT_FILE\nCURRENT_DAY\nCURRENT_WEEK\nCURRENT_MONTH\nCURRENT_YEAR\nCURRENT_STREAK\nWHOLE_VAULT\n","yaml","",[161,162,163,172,178,184,190,196,202],"code",{"__ignoreMap":159},[164,165,168],"span",{"class":166,"line":167},"line",1,[164,169,171],{"class":170},"sZZnC","CURRENT_FILE\n",[164,173,175],{"class":166,"line":174},2,[164,176,177],{"class":170},"CURRENT_DAY\n",[164,179,181],{"class":166,"line":180},3,[164,182,183],{"class":170},"CURRENT_WEEK\n",[164,185,187],{"class":166,"line":186},4,[164,188,189],{"class":170},"CURRENT_MONTH\n",[164,191,193],{"class":166,"line":192},5,[164,194,195],{"class":170},"CURRENT_YEAR\n",[164,197,199],{"class":166,"line":198},6,[164,200,201],{"class":170},"CURRENT_STREAK\n",[164,203,205],{"class":166,"line":204},7,[164,206,207],{"class":170},"WHOLE_VAULT\n",[15,209,210,213],{},[28,211,212],{},"Last Values",": calculated based on discrete ranges (24h, 7d, 30d, 365d).",[154,215,217],{"className":156,"code":216,"language":158,"meta":159,"style":159},"LAST_DAY\nLAST_WEEK\nLAST_MONTH\nLAST_YEAR\n",[161,218,219,224,229,234],{"__ignoreMap":159},[164,220,221],{"class":166,"line":167},[164,222,223],{"class":170},"LAST_DAY\n",[164,225,226],{"class":166,"line":174},[164,227,228],{"class":170},"LAST_WEEK\n",[164,230,231],{"class":166,"line":180},[164,232,233],{"class":170},"LAST_MONTH\n",[164,235,236],{"class":166,"line":186},[164,237,238],{"class":170},"LAST_YEAR\n",[118,240,242],{"id":241},"entries","Entries",[15,244,245],{},"The Entries component displays which files were modified and how many words or characters were added. Users can also delete unwanted entries to fix any tracking inconsistencies.",[15,247,248],{},[44,249],{"alt":250,"src":251},"Entries Component","/projects/ktr/ktr_entries.png",[118,253,255],{"id":254},"embedded-views","Embedded Views",[15,257,258],{},"All previous features can also be embedded and customized within any markdown note, allowing users to tailor their setup to be more contextually relevant, such as showing entries for a specific day or a heatmap of changes in a specific folder.",[15,260,261,262,265],{},"The commands were designed with simplicity in mind, prioritizing ",[28,263,264],{},"reasonable defaults"," while offering a breadth of settings and complex queries that are intuitively accessible.",[15,267,268,272],{},[44,269],{"alt":270,"src":271},"Custom Heatmap Code Block","/projects/ktr/ktr_codeblock-heatmap.png",[164,273,276],{"className":274},[275],"image-label","Heatmap embedded inside a note, with custom visual settings",[15,278,279,283],{},[44,280],{"alt":281,"src":282},"Custom Slot Code Block","/projects/ktr/ktr_codeblock-slot.png",[164,284,286],{"className":285},[275],"Set of embedded slots, with custom units and average mode",[118,288,290],{"id":289},"customization-settings","Customization & Settings",[15,292,293],{},"An extensive settings page allows users to expand the REGEX rules used for word counting to include other languages (like CJK support), customize the sidebar components, and set the daily goals that inform their streak.",[15,295,296],{},[44,297],{"alt":298,"src":299},"Settings Page","/projects/ktr/ktr_settings.png",[10,301,303],{"id":302},"other-resources","Other Resources",[58,305],{},[61,307,308],{},[64,309,310,315],{},[19,311,314],{"href":312,"rel":313},"https://www.youtube.com/watch?v=VS7aiZSYfgg",[23],"Video overview of the plugin"," (by Mike Schmitz)",[317,318,319],"style",{},"html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":159,"searchDepth":174,"depth":174,"links":321},[322,323,324,325],{"id":12,"depth":174,"text":13},{"id":89,"depth":174,"text":90},{"id":115,"depth":174,"text":116},{"id":302,"depth":174,"text":303},"2025 — Present","md",true,{"subtitle":330,"author":331},"Motivating people to write consistently","Benjamin Ezequiel","/projects/ktr",{"title":5,"description":159},{"loc":332},"projects/ktr",null,"/projects/ktr.thumbnail.jpg","kYooDtKVPvsl5BT9gSfPz5uaxTHJDjDGlkvQWV0Dhh8",1773346322993]