<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Breathe</title><id>https://breatheoutbreathe.in/feed.xml</id><subtitle>Recent Posts</subtitle><updated>2026-07-21T13:53:24Z</updated><link href="https://breatheoutbreathe.in/feed.xml" rel="self" /><link href="https://breatheoutbreathe.in" /><entry><title>Justin Squires Wedding Speech / 婚礼致辞</title><id>https://breatheoutbreathe.in/posts/justin-squires-wedding-speech-婚礼致辞.html</id><author><name>Justin Squires</name><email>contact@breatheoutbreathe.in</email></author><updated>2026-07-21T12:00:00Z</updated><link href="https://breatheoutbreathe.in/posts/justin-squires-wedding-speech-婚礼致辞.html" rel="alternate" /><content type="html">&lt;p&gt;Joseph and Bei Bei,&lt;/p&gt;&lt;p&gt;Your union is true. Your union is written. Your union is in faith and
true love. You guys are meant to be!&lt;/p&gt;&lt;p&gt;Joseph, if there’s anything that I trust about you in the few years
I’ve known you, it’s that your path and your ways are guided by a
wisdom and intuition further reaching than yourself, and this guidance
shines clear and bright to me in every interaction I’ve had with you
since Archangeli’s phonology class back in 2017.&lt;/p&gt;&lt;p&gt;You move with clear intention and a powerfully honest presence. Your
mundane, day to day actions are courageous in their orientation
towards a greater harmony of mind, body, and spirit for yourself,
those you love, and the whole world. All the many kinds of blessings
from heaven are with you, whether it be your music, your healing
hands, the ki that you move yourself and the world with, your
connection to the trees and the waters, your extraordinary heritage,
your mind which sings a song of discovery, deep and one-of-a-kind, and
your open and loving heart. Your substance is far more unique,
uplifting, and purposeful than any of us here will ever know, and in
all this I knew, before I met her, that your love Bei Bei sings a song
equal to you in beauty. Your way of life is far too honest, clear, and
in love for someone any less to have joined you in marriage as Bei Bei
joins you now. God has known the both of you, and in knowing you, he
knew your union. He knew your harmony, and he knew your completion. So
here we are!&lt;/p&gt;&lt;p&gt;To see you two now, coming together in the most powerful connection
that humans can share, is reassurance to me that whatever is really
going on in this crazy world we live in is actually far more excellent
and inspiring than it may otherwise seem. When I see you two together,
I see that God’s design is deeper, truer, freer, further, greater.&lt;/p&gt;&lt;p&gt;Bei Bei, Joseph is my brother across lifetimes, a special gift to me
from a higher place, and I see that you ground him, and you lift
him. You are clear water for him. You are his love. You center him,
and he holds you. I see how your tranquility, your levity, and your
honesty fortifies his heart. And to see you in this way for him is
inspiring to me. I love you, and I love that you love him in the
perfect and unique way that you do. You are his wife, and you are my
family. Welcome, and thank you for being here.&lt;/p&gt;&lt;p&gt;Justin Squires&lt;/p&gt;&lt;h2&gt;中文翻译：&lt;/h2&gt;&lt;p&gt;Joseph 和贝贝：&lt;/p&gt;&lt;p&gt;你们的结合是真实的，是早已写下的。你们因信仰与真爱而走到一起。你们本就
注定属于彼此！&lt;/p&gt;&lt;p&gt;Joseph，在认识你的这些年里，如果说有什么是我始终深信不疑的，那就是：你
所走的道路、你行事的方式，一直受到一种超越你自身的智慧与直觉所引领。自
从 2017 年我们在 Archangeli 的音系学课上认识以来，在与你的每一次相处中，
我都能清晰而明亮地感受到这份引领。&lt;/p&gt;&lt;p&gt;你带着明确的心意前行，也带着一种无比真诚而有力量的存在感。即使是在最平
凡的日常生活中，你所做的每一件事也都怀着勇气，并始终朝向一种更大的和
谐——让你自己、你所爱的人，乃至整个世界，在身体、心灵与精神之间更加完整。
来自上天的种种祝福都与你同在：你的音乐，你那双能够疗愈的手，你用来推动
自己、也影响这个世界的“气”，你与树木和水流之间的连接，你非凡的血脉与传
承，你那颗唱着探索之歌的心——深邃而独一无二——还有你敞开而充满爱的内心。
你真正的本质，比我们在场的任何人所能完全理解的都更加独特，更能带给人力
量，也更有方向和意义。正因为如此，在见到贝贝之前，我就已经知道，你所爱
的人，也一定会唱着一首与你同样美丽的歌。你的生活如此真诚、清澈而充满爱，
因此，今天与你步入婚姻的贝贝，也必定拥有与你相称的灵魂。上帝一直认识你
们两个人。而在认识你们的时候，祂也早已知道你们会结合。祂知道你们之间的
和谐，也知道你们会如何使彼此变得完整。于是，我们今天就在此庆祝！&lt;/p&gt;&lt;p&gt;此刻，看着你们走到一起，进入人与人之间所能拥有的最深刻、最有力量的连接，
我感到一种深深的安慰。这让我相信，无论我们所生活的这个疯狂世界究竟正在
发生什么，它都远比表面看起来更加美好，也更加鼓舞人心。当我看着你们在一
起，我看见上帝的安排比我们所能想象的更深、更真、更自由、更辽阔，也更伟
大。&lt;/p&gt;&lt;p&gt;贝贝，Joseph 是我生生世世的兄弟，是来自更高之处、赐予我的一份珍贵礼物。
我看见，你让他安稳地扎根，也让他向上生长。对他而言，你如清水一般澄澈。
你是他的爱。你让他的心安定下来，而他稳稳地承托着你。我看见你的宁静、你
的轻盈和你的真诚，如何让他的内心变得更加坚定。看见你以这样的方式陪伴着
他，也让我深受感动和鼓舞。&lt;/p&gt;&lt;p&gt;我爱你，也爱你以只属于你的、完美而独特的方式爱着他。你是他的妻子，也是
我的家人。欢迎你，也谢谢你来到这里。&lt;/p&gt;&lt;p&gt;Justin Squires&lt;/p&gt;</content></entry><entry><title>外公的婚礼祝福 / Wedding Blessings from Grandpa</title><id>https://breatheoutbreathe.in/posts/外公的婚礼祝福-wedding-blessings-from-grandpa.html</id><author><name>贝贝 Bei Bei</name><email>contact@breatheoutbreathe.in</email></author><updated>2026-07-20T12:00:00Z</updated><link href="https://breatheoutbreathe.in/posts/外公的婚礼祝福-wedding-blessings-from-grandpa.html" rel="alternate" /><content type="html">&lt;p&gt;恭喜外孙女贝贝和小九新婚之喜！远在亚利桑那州缔结良缘，新春佳节双喜临门。外公特意填词两阕，既合中式雅韵，又寄万里祝福。两阕词皆紧扣新春、新婚、远地良缘之意，平仄韵脚依词牌正体格律，既合迎宾贺婚之礼，又藏阖家祝福之情。贝贝，如你们那里有“中国红的”大红纸买的话，你去买张红纸抄写一份贴在你们的新婚房间里，作个纪念。《迎宾词》用红纸抄写一份贴在你们办喜酒的大门。（外公外婆衷心祝福，2026年2月19日于中国）&lt;/p&gt;&lt;p&gt;Congratulations to our granddaughter Bei Bei and Joseph on your marriage!&lt;/p&gt;&lt;p&gt;You have joined your lives together far away in Arizona, and your wedding has brought us double happiness during the Chinese New Year. To celebrate, Grandpa has written two traditional Chinese poems especially for you. They carry the grace of Chinese poetry, as well as our blessings sent across thousands of miles.&lt;/p&gt;&lt;p&gt;Both poems are about the Chinese New Year, your marriage, and the happy fate that brought you together in a faraway place. Their tones and rhymes follow the traditional forms. They are written both to welcome the guests and celebrate the wedding, while also carrying the love and blessings of the whole family.&lt;/p&gt;&lt;p&gt;Bei Bei, if you can find some bright red paper—the traditional Chinese red—where you live, please buy a sheet and copy the poems onto it. You can hang them in your newlywed room as a keepsake.&lt;/p&gt;&lt;p&gt;Please also copy the poem titled “Welcoming the Guests” onto red paper and hang it by the entrance of the place where you hold your wedding banquet.&lt;/p&gt;&lt;p&gt;With all our hearts, Grandpa and Grandma wish you both a happy marriage and a beautiful life together.&lt;/p&gt;&lt;p&gt;February 19, 2026
China&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;《春光好》&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Spring in Gentle Light&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;莺语软，
Soft birds sing,&lt;/p&gt;&lt;p&gt;柳丝柔，
Willows sway softly,&lt;/p&gt;&lt;p&gt;瑞烟浮。
Auspicious mists drift.&lt;/p&gt;&lt;p&gt;万里天涯春正好，
Across ten thousand miles, spring is bright—&lt;/p&gt;&lt;p&gt;缔鸾俦。
Lovebirds unite.&lt;/p&gt;&lt;p&gt;锦瑟同心相绾，
Twin zither hearts bound as one,&lt;/p&gt;&lt;p&gt;华堂笑靥凝眸。
Smiles meet in the bridal hall.&lt;/p&gt;&lt;p&gt;岁岁琴瑟和韵永，
Year after year, harmonies run,&lt;/p&gt;&lt;p&gt;福长留。
Blessings ever fall.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;《浪淘沙·迎宾词》&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Welcoming Verse — Tune of Lang Tao Sha&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;嘉节启新章，
This fair day opens a chapter new,&lt;/p&gt;&lt;p&gt;喜气盈堂。
Joy fills the hall through.&lt;/p&gt;&lt;p&gt;宾朋同贺凤求凰。
Friends gather to bless the phoenix pair,&lt;/p&gt;&lt;p&gt;万里姻缘天作合，
A bond heaven-made across miles so far—&lt;/p&gt;&lt;p&gt;共祝安康。
All wish them peace to share.&lt;/p&gt;&lt;p&gt;笑语暖壶觞，
Warm laughter lifts the wine,&lt;/p&gt;&lt;p&gt;春意绵长。
Spring lingers, tender and long.&lt;/p&gt;&lt;p&gt;兰闺佳偶岁月香。
A graceful couple, their years refined,&lt;/p&gt;&lt;p&gt;白首齐眉情不改，
Side by side till hair turns white, love strong—&lt;/p&gt;&lt;p&gt;世世荣昌。
Blessed through ages in song.&lt;/p&gt;</content></entry><entry><title>我们的故事 (第一集) / Our Story (Episode 1)</title><id>https://breatheoutbreathe.in/posts/我们的故事-第一集-our-story-episode-1.html</id><author><name>贝贝 Bei Bei</name><email>contact@breatheoutbreathe.in</email></author><updated>2026-07-20T12:00:00Z</updated><link href="https://breatheoutbreathe.in/posts/我们的故事-第一集-our-story-episode-1.html" rel="alternate" /><content type="html">&lt;p&gt;2025年年初，我受航长的邀请参加每周一次的启发聚会（一系列帮助人了解基督教信仰的课程）。我那时住在下关，每次路上要花一个半小时，但我无比庆幸自己参与其中，因为在那里我认识了对我非常重要的一群好朋友。3月时我还信誓旦旦地告诉他们我懒得搬家，每周这么赶路也无所谓，转头4月1号我就已经住进了三文笔村的新家。我有了自己的沙盘工作室，也有了与朋友们更频繁的相聚。我们在聿敏家打鼓、跳舞，在航长家聚餐、欢唱，在Raymond家喝酒、畅聊……我的“闭关”状态渐渐褪去，被友情的连接所填充。6月的一天，我和姚瑶约好了吃午餐，她早上临时问我能不能再带一位刚认识的外国朋友一起，我随即就答应了，并不知道自己命运会因此发生翻天覆地的变化。在这个愉快的下午之后，我和小九每天都会见面，每次见面聊天聊到不想告别。两周以后在一个聚会上我邀请小九和我一起跳舞，我们两个十分笨拙地相拥跳舞，一不小心就踩到对方的脚。那天告别时我意识到，我要恋爱了。第二天小九来到我家问我，虽然我们的未来充满了不确定，我是否愿意和他开始恋爱。我们的故事就这样在懵懂的心动中开始了。&lt;/p&gt;&lt;p&gt;At the beginning of 2025, Hangzhang invited me to join a weekly Alpha gathering (a set of structured lessons for learning about Christianity). I was living in Xiaguan at the time, so getting there took an hour and a half each way. Even so, I am incredibly glad that I kept going, because that was where I met a group of friends who would become very important to me.&lt;/p&gt;&lt;p&gt;As late as March, I was still confidently telling everyone that I was too lazy to move and perfectly happy to spend all that time on the road every week. And then, almost as soon as I had said it, I moved into my new home in Sanwenbi Village on April 1.&lt;/p&gt;&lt;p&gt;The move gave me a sandplay studio of my own, but more importantly, it brought me much closer to my friends. We played drums and danced at Yumin’s place, gathered for food and singing at Hangzhang’s, and enjoyed homemade cocktails and conversation late into the night at Raymond’s. Without my really noticing, the “retreat” I had been living in slowly came to an end, and friendship began to fill the space it left behind.&lt;/p&gt;&lt;p&gt;Then one day in June, I made plans to have lunch with Yaoyao. That morning, she asked at the last minute whether she could bring along a foreign friend she had just met. I agreed right away, with no idea that this small decision was about to transform my life.&lt;/p&gt;&lt;p&gt;After that lovely afternoon, Joseph and I started seeing each other every day. Each time we met, we would talk until neither of us wanted to say goodbye.&lt;/p&gt;&lt;p&gt;Two weeks later, at a gathering, I asked him to dance with me. We held each other and moved around very awkwardly, stepping on each other’s feet more than once. By the time we said goodbye that evening, I knew I was falling in love.&lt;/p&gt;&lt;p&gt;The next day, Joseph came to my home and asked whether I would be willing to start a relationship with him, even though there was so much uncertainty ahead of us.&lt;/p&gt;&lt;p&gt;That was how our story began: with a shy and slightly confused kind of excitement, before either of us fully understood where it would lead.&lt;/p&gt;</content></entry><entry><title>Barrel Compost Toilet (Episode 1) / 桶式堆肥厕所 (第一集)</title><id>https://breatheoutbreathe.in/posts/barrel-compost-toilet-episode-1-桶式堆肥厕所-第一集.html</id><author><name>Joseph Turner</name><email>contact@breatheoutbreathe.in</email></author><updated>2026-07-17T12:00:00Z</updated><link href="https://breatheoutbreathe.in/posts/barrel-compost-toilet-episode-1-桶式堆肥厕所-第一集.html" rel="alternate" /><content type="html">&lt;p&gt;After &lt;a href=&quot;https://breatheoutbreathe.in/light/2026-02-19--tucson-wedding/index.html&quot;&gt;we got married in
February&lt;/a&gt;,
Bei Bei and I honeymooned at the &lt;a href=&quot;https://cascabelconservation.org/hermitage/&quot;&gt;Cascabel Conservation
Association&lt;/a&gt;'s Cottage
Hermitage, a sublime solitary retreat nestled in Hot Springs Canyon
east of Tucson, AZ.  We actually made plans &lt;em&gt;before&lt;/em&gt; we got married to
do the week-long retreat together in Cascabel!  Only after getting
engaged three weeks before our wedding did we realize that the retreat
would be the perfect honeymoon.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://breatheoutbreathe.in/light/2026-02-19--tucson-wedding/index.html&quot;&gt;二月结
婚
&lt;/a&gt;
后，贝贝和我来到亚利桑那州图森以东、热泉峡谷中的&lt;a href=&quot;https://cascabelconservation.org/hermitage/&quot;&gt;卡斯卡贝尔保护协
会&lt;/a&gt;隐修小屋度蜜月。那是一
处静谧绝美、远离尘嚣的独居隐居地。其实在结婚之前，我们就已经计划好，要
一起去卡斯卡贝尔进行为期一周的静修！直到婚礼前三周订婚后，我们才意识到，
这次静修正好可以成为一场再完美不过的蜜月。&lt;/p&gt;&lt;p&gt;Immediately following our honeymoon-retreat week, we were blessed to
join in &lt;a href=&quot;https://saguarojuniper.org/&quot;&gt;Saguaro Juniper&lt;/a&gt;'s 3rd annual
&lt;a href=&quot;https://saguarojuniper.org/saguaro-juniper-home-on-the-range-march-6-8-cascabel-arizona/&quot;&gt;Home On the
Range&lt;/a&gt;
event.  We enjoyed a morning work-party, Papa Cobre patties, and
fulfilling conversation with old and new friends.&lt;/p&gt;&lt;p&gt;蜜月静修结束后，我们又很幸运地参加了 &lt;a href=&quot;https://saguarojuniper.org/&quot;&gt;Saguaro
Juniper&lt;/a&gt; 举办的第三届年度“&lt;a href=&quot;https://saguarojuniper.org/saguaro-juniper-home-on-the-range-march-6-8-cascabel-arizona/&quot;&gt;Home On the
Range&lt;/a&gt;”
（牧场家园开放日）活动。那天上午，我们一起参加了集体劳动，品尝了 Papa
Cobre 肉饼，还和新老朋友们进行了一番充实而愉快的交流。&lt;/p&gt;&lt;p&gt;David Omick and Pearl Mast, whose &lt;a href=&quot;https://www.omick.net/&quot;&gt;creatively minimal
lifestyle&lt;/a&gt; inspires us greatly, patiently
fielded countless questions about their brilliant barrel composting
design.  David, who only a few days prior underwent knee surgery,
hopped up to eagerly show us some of the composting toilets they built
and installed for private and community use around Cascabel.&lt;/p&gt;&lt;p&gt;David Omick 和 Pearl Mast 极具创意的&lt;a href=&quot;https://www.omick.net/&quot;&gt;极简生活方
式&lt;/a&gt;一直深深启发着我们。他们耐心回答了我们关于
其巧妙桶式堆肥系统设计的无数问题。David 几天前才刚做完膝盖手术，却还是
一跃而起，兴致勃勃地带我们参观了他们在卡斯卡贝尔各处建造和安装的一些堆
肥厕所，这些设施既供私人家庭使用，也供社区共同使用。&lt;/p&gt;&lt;p&gt;The 55-gallon drum composting toilet is safe (even &lt;a href=&quot;https://watershedmg.org/programs/composting-toilets&quot;&gt;approved by the
ADEQ&lt;/a&gt;), easy to
put together, and comfortable to use.  What's more, David and Pearl's designs
are available for anyone to study &lt;a href=&quot;https://www.omick.net/composting_toilets/barrel_toilet.htm&quot;&gt;for free on their
website&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;这种采用 55 加仑桶的堆肥厕所安全可靠——甚至获&lt;a href=&quot;https://watershedmg.org/programs/composting-toilets&quot;&gt;得了亚利桑那州环境质量部
（ADEQ）的批准&lt;/a&gt;——
组装简单，使用起来也很舒适。更棒的是，David 和 Pearl 已经把设计方案&lt;a href=&quot;https://www.omick.net/composting_toilets/barrel_toilet.htm&quot;&gt;免
费发布在他们的网站
上&lt;/a&gt;，任何
人都可以查看和学习！&lt;/p&gt;&lt;p&gt;This blog post summarizes some thoughts I had while building a
composting toilet based on these designs.  Thank you, David and Pearl,
for sharing your wisdom!  Thank you, Dad, for carpentry guidance!
Thank you, Bei Bei, for diligent quality assurance testing!&lt;/p&gt;&lt;p&gt;这篇博客文章总结了我依据这些设计建造堆肥厕所时产生的一些想法。
谢谢 David 和 Pearl，感谢你们无私分享自己的智慧！
谢谢爸爸，在木工方面给予我的指导！
谢谢贝贝，认真负责地完成了质量保证测试！&lt;/p&gt;&lt;h2&gt;The Throne&lt;/h2&gt;&lt;h2&gt;宝座&lt;/h2&gt;&lt;p&gt;David and Pearl's original design recommends burying the barrels
halfway so that the business-doer can comfortably sit without having
to climb up stairs.  However we wanted to install our toilet on the
front porch, which already has a wood floor.  This meant that we
needed to build some steps to get up to the toilet:&lt;/p&gt;&lt;p&gt;David 和 Pearl 的原始设计建议把桶体埋入地下约一半，这样如厕的人无需爬
楼梯，就能舒适地坐上去。不过，我们想把厕所安装在前廊上，而那里本来就铺
有木地板。这意味着，我们需要搭几级台阶才能坐上马桶：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/steps-to-the-throne.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;The main disadvantage to this approach is that it requires moving the
steps and the barrel after it's full, but with two people and a large
hand truck, it's no problem to replace the full barrel every few
months.  Alternatively, David's website suggests placing a plant dolly
underneath the barrel for easy transportation indoors.&lt;/p&gt;&lt;p&gt;这种做法最大的缺点是，桶装满后，必须先移开台阶，再把桶搬走。不过，只要
有两个人，再配上一辆大型手推车，每隔几个月更换一次满桶并不是什么难事。
另一种办法是，按照 David 网站上的建议，在桶底下放一个带轮子的花盆托架，
这样在室内搬运起来会方便得多。&lt;/p&gt;&lt;h2&gt;Toilet top&lt;/h2&gt;&lt;h2&gt;马桶顶板&lt;/h2&gt;&lt;p&gt;Instead of making the toilet top out of epoxy-coated wood, aluminum,
or concrete, we found a piece of 5/16&amp;quot; grey plastic material at the
scrapyard and cut out the toilet top and insect plate with a jigsaw.
It resists weathering and can be cleaned easily.&lt;/p&gt;&lt;p&gt;我们没有用涂有环氧树脂的木板、铝板或混凝土来制作马桶顶板，而是在废品回
收场找到了一块厚约 8 毫米（5/16 英寸）的灰色塑料板材，再用曲线锯切割出
马桶顶板和防虫板。这种材料经得起日晒雨淋，也很容易清洁。&lt;/p&gt;&lt;p&gt;We did not add a hold-down spring assembly, but instead relied on the
snug fit between the locator bolts (we used 3/8&amp;quot; bolts, less prone to
bending than the 1/4&amp;quot; bolts in the original design) and the holes
drilled around the lip of the barrel.&lt;/p&gt;&lt;p&gt;我们没有安装弹簧压紧装置，而是依靠定位螺栓与桶口边缘所钻孔洞之间的紧密
配合来固定顶板。我们使用了直径约 10 毫米（3/8 英寸）的螺栓，比原设计中
直径约 6 毫米（1/4 英寸）的螺栓更不容易弯曲。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/heavier-gauge-locator-bolts.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;h2&gt;Urine diverter&lt;/h2&gt;&lt;h2&gt;尿液分流器&lt;/h2&gt;&lt;p&gt;David and Pearl's design calls for a funnel + rubber stopper as a
urine diverter.  I hacked together an alternative design using old
plastic jugs.  Cut a milk/vinegar/oil jug to the desired shape.  Drill
a hole in the lid of the jug the same diameter as your tubing.  Cut
the last 1/2&amp;quot; of the tubing open lengthwise, push it through the hole
in the lid, and screw the two flaps of the tubing down to the lid.
It's not perfectly watertight, but a little moisture is good for the
compost.  If your milk jug has a handle, cut the handle long, bend it
over, and screw it down to itself.&lt;/p&gt;&lt;p&gt;David 和 Pearl 的设计使用漏斗和橡胶塞来制作尿液分流器。我则用几个废旧
塑料壶，临时拼出了另一种做法。先把牛奶壶、醋壶或食用油壶剪成需要的形状。
然后在壶盖上钻一个孔，孔径与导管外径相同。把导管末端约 1.3 厘米（1/2
英寸）长的一段纵向剪开，将导管穿过壶盖上的孔，再把剪开的两片分别用螺丝
固定在壶盖上。这个连接处并不能做到完全不漏水，不过堆肥中保留少量水分反
而是好事。如果牛奶壶带有把手，剪的时候把把手留长一些，再将它弯折过去，
用螺丝固定在把手自身上。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-side-disassembled-3.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-side-disassembled-2.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-side-disassembled-1.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-side-view.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-top-view.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;h2&gt;Keeping the urine diverter clean&lt;/h2&gt;&lt;h2&gt;保持尿液分流器清洁&lt;/h2&gt;&lt;p&gt;Instead of using a stainless steel sink drain screen to keep the
diverter from clogging with misplaced cover material, I wrapped the
entire urine diverter with insect screen.  This way, when cover
material accidentally falls onto the diverter, it mostly bounces off,
reducing the need for manual cleaning.  However, the screen and urine
diverter can still be removed and cleaned, since it's fastened in
place by a piece of wire which can hinge up and out of the way.&lt;/p&gt;&lt;p&gt;原设计使用不锈钢水槽滤网，防止误落的覆盖材料堵住尿液分流器。我没有采用
这种做法，而是用防虫网把整个尿液分流器包了起来。这样一来，覆盖材料即使
不小心掉到分流器上，大多也会弹开，从而减少手动清理的次数。不过，防虫网
和尿液分流器仍然可以拆下来清洗。它们由一段金属丝固定在原位，需要清理时，
可以把金属丝像铰链一样向上掀开，让到一旁。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-screen.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/hinged-screen-holder.webm&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;An alternative method for keep the urine diverter clean while the
barrel is aging is to turn the bottom of the milk jug into a cover
which fits snugly over the urine diverter.  That way, as you stir the
aging compost, no flying debris will fall in.&lt;/p&gt;&lt;p&gt;在桶内的堆肥静置腐熟期间，还有另一种保持尿液分流器清洁的方法：把牛奶壶
的底部剪下来，做成一个能够严密扣在分流器上的盖子。这样，翻动正在腐熟的
堆肥时，飞散的碎屑就不会落进分流器里。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-1.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-cover.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-diverter-2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;h2&gt;Urine collection&lt;/h2&gt;&lt;h2&gt;尿液收集&lt;/h2&gt;&lt;p&gt;Instead of installing an underground leaching chamber, we opted to
save the urine for our garden!  Just run a line (we used rabbit
watering system hose) from the barrel through a hole in the wall and
into the lid of a 5-gallon bucket.  We also added orange peels into
the bucket to cut the smell.&lt;/p&gt;&lt;p&gt;我们没有安装地下渗滤装置，而是决定把尿液收集起来，用在花园里！只需从桶
里接出一根软管——我们用的是兔用自动饮水系统的软管——让它穿过墙上的孔，再
接入一个约 19 升（5 加仑）塑料桶的桶盖即可。我们还在桶里放了一些橙皮，
以减轻异味。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/rabbit-water-hose-urine-diverter.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-collection-bucket.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/urine-collection-orange-peels.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;h2&gt;More fun hacks&lt;/h2&gt;&lt;h2&gt;更多有趣的小改造&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;An old dish rack cut down and repurposed as a hanger for the insect plate.
Nice one, Dad!&lt;/li&gt;&lt;li&gt;把一个旧碗碟沥水架裁短后重新利用，做成悬挂防虫板的架子。（好主意呀，
老爸！）&lt;/li&gt;&lt;li&gt;Another way to install the mason jar insect trap is to directly
clamp a Fernco fitting onto the mason jar (the &lt;a href=&quot;https://www.omick.net/composting_toilets/CIMG7113,%20wil%20and%20mai%27s%20barrel%20toilet,%20small.jpg&quot;&gt;original
design&lt;/a&gt;
involves resting the mason jar in a sanitary tee, which I was
concerned would get knocked over if anyone went wild on the John)&lt;/li&gt;&lt;li&gt;安装梅森玻璃罐捕虫器还有另一种方法：直接用 Fernco 橡胶接头把玻璃罐夹
紧固定。&lt;a href=&quot;https://www.omick.net/composting_toilets/CIMG7113,%20wil%20and%20mai%27s%20barrel%20toilet,%20small.jpg&quot;&gt;原设
计
&lt;/a&gt;
是把玻璃罐放在卫生三通接头里，但我担心万一有人上厕所时动作太大，会把
它碰倒。&lt;/li&gt;&lt;li&gt;A plastic jug scoop for sawdust cover material.&lt;/li&gt;&lt;li&gt;还可以用旧塑料壶做一个小铲子，用来舀作为覆盖材料的锯末。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/dish-rack-hanger-for-toilet-lid.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/insect-trap.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/plastic-jug-scoop.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;h1&gt;Safe, Happy Compost&lt;/h1&gt;&lt;h2&gt;安全又有活力的堆肥&lt;/h2&gt;&lt;p&gt;After we filled up the first barrel, happy little sprouts began
popping up on top of the compost material, only to be turned under by
our compost crank each week.  The internal temperature of the compost
rose to 122℉ (50℃) and stayed there for a few days, high enough to
kill all potential parasites and pathogens, according to the &amp;quot;Time and
Temperature Safety Zone&amp;quot; graph from Joseph Jenkins's &lt;em&gt;Humanure
Handbook&lt;/em&gt; (Version 4), Chapter 13, page 204.&lt;/p&gt;&lt;p&gt;第一个桶装满后，堆肥表面开始冒出一株株生机勃勃的小嫩芽，不过每周都会被
我们的堆肥搅拌器重新翻进堆料里。堆肥内部的温度升至 50℃（122℉），并维持
了数日。根据 Joseph Jenkins 所著《人粪堆肥手册》第四版第 13 章第 204
页中的“时间与温度安全区”图表，这一温度已经足以杀灭所有可能存在的寄生虫
和病原体。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/happy-compost-toilet-sprout.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/compost-toilet-thermometer.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/static/images/2026-07-17-barrel-compost-toilet-episode-one/time-and-temperature-safety-zone-joseph-jenkins-humanure-handbook.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;h1&gt;On the next episode of &lt;em&gt;Barrel Compost Toilet&lt;/em&gt;...&lt;/h1&gt;&lt;h2&gt;《桶式堆肥厕所》下回预告……&lt;/h2&gt;&lt;p&gt;Bei Bei and I are now preparing to move into our new home in Xizhou
Town, Dali City, Yunnan Province, China!  Stay tuned for more compost
toilet updates!&lt;/p&gt;&lt;p&gt;贝贝和我正在准备搬进位于中国云南省大理市喜洲镇的新家！敬请期待更多关于
堆肥厕所的后续更新！&lt;/p&gt;&lt;p&gt;We are tremendously grateful to all of the folks in Cascabel who
welcomed us so warmly!  We can't wait until the next time we get
together.  Thank you!!&lt;/p&gt;&lt;p&gt;我们由衷感谢卡斯卡贝尔的每一位朋友，感谢大家如此热情地欢迎和接纳我们！
我们已经迫不及待地盼着下一次相聚了。谢谢大家！！&lt;/p&gt;</content></entry><entry><title>Follow Up on emails with mu4e and org-capture</title><id>https://breatheoutbreathe.in/posts/follow-up-on-emails-with-mu4e-and-org-capture.html</id><author><name>Joseph Turner</name><email>contact@breatheoutbreathe.in</email></author><updated>2025-02-03T12:00:00Z</updated><link href="https://breatheoutbreathe.in/posts/follow-up-on-emails-with-mu4e-and-org-capture.html" rel="alternate" /><content type="html">&lt;p&gt;When I send an email, I often want my agenda to remind me to follow up
a few days later.  Thanks to &lt;a href=&quot;https://www.djcbsoftware.nl/&quot;&gt;Dirk-Jan C. Binnema&lt;/a&gt;'s help, I was able to
set this up with &lt;code&gt;mu4e&lt;/code&gt; and &lt;code&gt;org-capture&lt;/code&gt;.&lt;/p&gt;&lt;h1&gt;&lt;code&gt;mu4e&lt;/code&gt; + &lt;code&gt;org-capture&lt;/code&gt;&lt;/h1&gt;&lt;p&gt;Here's the code:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  (add-to-list
   'org-capture-templates
   (&amp;quot;efu&amp;quot; &amp;quot;Follow Up&amp;quot; entry (file+olp &amp;quot;todo/todo.org&amp;quot; &amp;quot;Email&amp;quot; &amp;quot;Follow Up&amp;quot;)
    &amp;quot;* TODO Follow up with %(eval sent-message-to) on [[mu4e:msgid:%(eval sent-message-id)][%(eval sent-subject)]]
SCHEDULED: %(org-insert-time-stamp (org-read-date nil t \&amp;quot;+3d\&amp;quot;))
%i&amp;quot;))

  (add-hook 'message-sent-hook #'my/org-capture-sent-mail)

  (defun my/org-capture-sent-mail ()
    &amp;quot;Prepare to capture sent mail after window configuration is reset.&amp;quot;
    (let* ((sent-message-id
          (replace-regexp-in-string
           &amp;quot;[&amp;lt;&amp;gt;]&amp;quot; &amp;quot;&amp;quot; (message-fetch-field &amp;quot;Message-Id&amp;quot;)))
           (sent-message-to
            (replace-regexp-in-string &amp;quot; &amp;lt;.*&amp;gt;&amp;quot; &amp;quot;&amp;quot; (message-fetch-field &amp;quot;To&amp;quot;)))
         (sent-subject (or (message-fetch-field &amp;quot;Subject&amp;quot;) &amp;quot;No subject&amp;quot;)))
      (org-capture nil &amp;quot;efu&amp;quot;)
      (add-hook 'mu4e-compose-post-hook #'my/pop-to-buffer-org-capture-mail 99)))

  (defun my/pop-to-buffer-org-capture-mail ()
    (pop-to-buffer
     (car (match-buffers
           (lambda (buffer)
             (equal &amp;quot;efu&amp;quot;
                    (plist-get
                     (buffer-local-value
                      'org-capture-current-plist buffer)
                     :key))))))
    (remove-hook 'mu4e-compose-post-hook #'my/pop-to-buffer-org-capture-mail))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After I send an email, I see the &lt;code&gt;org-capture&lt;/code&gt; pop-up window
pre-filled from the template:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;*** TODO Follow up with John Doe on [[mu4e:msgid:1234576890][Beautiful Snowy Morning]]
SCHEDULED: &amp;lt;2025-02-06 Wed&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If I run &lt;code&gt;org-capture-finalize&lt;/code&gt; (&lt;code&gt;C-c C-c&lt;/code&gt;), then I'll be reminded in
three days to follow up on the email.  Before capturing the reminder,
I can add more information or edit the date if I want to have more or
less time before it shows up on my agenda.  Alternatively, I can run
&lt;code&gt;org-capture-kill&lt;/code&gt; (&lt;code&gt;C-c C-k&lt;/code&gt;) if I don't want to be reminded at all.&lt;/p&gt;&lt;h2&gt;Technical Details&lt;/h2&gt;&lt;p&gt;After closing a composition buffer, &lt;code&gt;mu4e&lt;/code&gt; restores your window
configuration in &lt;code&gt;mu4e-compose-post-hook&lt;/code&gt;, a feature which I want to
keep.  However, this means that the &lt;code&gt;org-capture&lt;/code&gt; buffer gets hidden
when the windows are restored.1 The solution above is to add a
self-removing hook function &lt;code&gt;my/pop-to-buffer-org-capture-mail&lt;/code&gt; to
&lt;code&gt;mu4e-compose-post-hook&lt;/code&gt; which pops back to the &lt;code&gt;org-capture&lt;/code&gt; buffer
after the window configuration is restored.&lt;/p&gt;&lt;h2&gt;Links&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/djcb/mu/issues/2809&quot;&gt;Issue in mu4e tracker with djcb's comments&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://git.sr.ht/~breatheoutbreathein/dotfiles/tree/master/item/.emacs.d/init.el&quot;&gt;My Emacs configuration&lt;/a&gt; (search for &lt;code&gt;my/org-capture-sent-mail&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;Footnotes&lt;/h1&gt;&lt;h4&gt;1&lt;/h4&gt;&lt;p&gt;I want to interact with the org capture buffer each time I send
an email, so I can edit or cancel the reminder while capturing it.  If
I didn't want to interact with the org capture buffer, I could put
&lt;code&gt;:immediate-finish&lt;/code&gt; in the &lt;code&gt;org-capture&lt;/code&gt; template and get rid of
&lt;code&gt;my/pop-to-buffer-org-capture-mail&lt;/code&gt;.&lt;/p&gt;</content></entry><entry><title>Query Regexp Replace Lisp Replacement</title><id>https://breatheoutbreathe.in/posts/query-regexp-replace-lisp-replacement.html</id><author><name>Joseph Turner</name><email>contact@breatheoutbreathe.in</email></author><updated>2024-12-19T12:00:00Z</updated><link href="https://breatheoutbreathe.in/posts/query-regexp-replace-lisp-replacement.html" rel="alternate" /><content type="html">&lt;p&gt;I rarely use &lt;code&gt;query-replace-regexp&lt;/code&gt;'s lisp expression replacement
feature, but I came upon a good use for it today!&lt;/p&gt;&lt;p&gt;Recently, I've been testing out &lt;a href=&quot;https://github.com/bohonghuang/org-srs/&quot;&gt;org-srs&lt;/a&gt; for practicing Mandarin vocab.
So far, it works very well!  When I asked to truncate the serialized
data which gets written to the Org files to reduce diff noise and to
make the &lt;code&gt;state&lt;/code&gt; column fit on my small laptop screen, &lt;a href=&quot;https://github.com/bohonghuang/org-srs/issues/8#issuecomment-2551418929&quot;&gt;the package
author kindly offered a workaround&lt;/a&gt;1, which causes this:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;# Without workaround:

#+NAME: srsitem:2d51efcd-8523-4432-b074-50d1ba4c45b3
| ! | timestamp            | rating |          stability |        difficulty | state     |
|---+----------------------+--------+--------------------+-------------------+-----------|
|   | 2024-12-11T18:37:19Z |        |                0.0 |               0.0 | :new      |
|   | 2024-12-11T18:38:23Z | :again |             0.4072 |            7.2102 | :learning |
|   | 2024-12-11T18:39:05Z | :easy  | 0.9375660842587888 | 6.078123501986166 | :review   |
|   | 2024-12-14T07:07:08Z | :easy  | 16.133939701409084 | 4.972537594025855 | :review   |
| * | 2024-12-30T07:07:08Z |        |                    |                   |           |&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to become this:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;# With workaround:

#+NAME: srsitem:2d51efcd-8523-4432-b074-50d1ba4c45b3
| ! | timestamp            | rating | stability | difficulty | state     |
|---+----------------------+--------+-----------+------------+-----------|
|   | 2024-12-11T18:37:19Z |        |       0.0 |        0.0 | :new      |
|   | 2024-12-11T18:38:23Z | :again |      0.41 |       7.21 | :learning |
|   | 2024-12-11T18:39:05Z | :easy  |      0.94 |       6.08 | :review   |
|   | 2024-12-14T07:07:08Z | :easy  |     16.13 |       4.97 | :review   |
| * | 2024-12-30T07:07:08Z |        |           |            |           |&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;However, I already had some existing data in my &lt;code&gt;chinese.org&lt;/code&gt; file.
To truncate that data, I used this lisp expression replacement with
&lt;code&gt;query-replace-regexp&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;[0-9]+\.\([0-9]+\) → \,(if (length&amp;gt; \1 2) (format &amp;quot;%0.02f&amp;quot; \#0) \0)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The regexp matches the numbers in the &lt;code&gt;stability&lt;/code&gt; and &lt;code&gt;difficulty&lt;/code&gt;
columns.  My &lt;code&gt;chinese.org&lt;/code&gt; file conveniently contains no other numbers
in decimal-point notation.  The lisp expression checks if the part
after the decimal point contains more than two numbers, since I don't
want &lt;code&gt;0.0&lt;/code&gt; to become &lt;code&gt;0.00&lt;/code&gt;.  If it does, then the &lt;code&gt;format&lt;/code&gt; expression
rounds it to two decimal places.  Otherwise, the match is left as-is.
Note that &lt;code&gt;\#0&lt;/code&gt; in the replacement text converts the match string to a
number, which is required by the &lt;code&gt;%f&lt;/code&gt; format type specifier.&lt;/p&gt;&lt;p&gt;After replacing all of the numbers in the buffer, I ran a quick
keyboard macro to align all of the &lt;code&gt;srsitem&lt;/code&gt; tables to fit the
narrower contents, but I'll leave that as an exercise to the reader.&lt;/p&gt;&lt;p&gt;I hope this helps you.  Feel free to &lt;a href=&quot;../contact.md&quot;&gt;contact me&lt;/a&gt; with suggestions,
corrections, or questions!&lt;/p&gt;&lt;h1&gt;Footnotes&lt;/h1&gt;&lt;h4&gt;1&lt;/h4&gt;&lt;p&gt;Workaround to truncate the data:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;(cl-defmethod org-srs-algorithm-repeat :around ((_ fsrs-scheduler) _)
  (let ((output (cl-call-next-method)))
    (setf (alist-get 'stability output) (format &amp;quot;%.02f&amp;quot; (alist-get 'stability output))
          (alist-get 'difficulty output) (format &amp;quot;%.02f&amp;quot; (alist-get 'difficulty output)))
    output))&lt;/code&gt;&lt;/pre&gt;</content></entry><entry><title>Mirror Worg to a Hyperdrive</title><id>https://breatheoutbreathe.in/posts/mirror-worg-to-a-hyperdrive.html</id><author><name>Joseph Turner</name><email>contact@breatheoutbreathe.in</email></author><updated>2024-12-16T12:00:00Z</updated><link href="https://breatheoutbreathe.in/posts/mirror-worg-to-a-hyperdrive.html" rel="alternate" /><content type="html">&lt;p&gt;During the Q&amp;amp;A session of the &lt;a href=&quot;https://emacsconf.org/2024/talks/hyperdrive/&quot;&gt;EmacsConf 2024 hyperdrive.el talk&lt;/a&gt;, Ihor
Radchenko suggested using hyperdrive to distribute &lt;a href=&quot;https://git.sr.ht/~bzg/worg/&quot;&gt;worg&lt;/a&gt;, the
community-driven Org documentation written in Org format.&lt;/p&gt;&lt;p&gt;Thanks, Ihor!&lt;/p&gt;&lt;h1&gt;Mirror &lt;code&gt;worg&lt;/code&gt; to a hyperdrive&lt;/h1&gt;&lt;p&gt;You can run these commands on a local or remote machine.  I chose to
mirror &lt;code&gt;worg&lt;/code&gt; to a hyperdrive on a remote Debian 12 VPS so that the
content stays available when I turn off my computer.&lt;/p&gt;&lt;p&gt;Install &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;dtach&lt;/code&gt; and &lt;a href=&quot;https://github.com/holepunchto/drives/&quot;&gt;drives cli&lt;/a&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;sudo apt install git dtach npm
npm install -g drives&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Clone &lt;code&gt;worg&lt;/code&gt;, then create a new corestore and hyperdrive:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;git clone https://git.sr.ht/~bzg/worg/
cd worg
drives init
drives touch # Copy hyperdrive public key from output&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mirror the &lt;code&gt;worg&lt;/code&gt; repository into the newly created hyperdrive:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;# drives mirror --dry-run . bpb1bq6sdfajw4bok7k9tdmrq153pbwzcyfkrqrfxw3hhihyddhy # Dry run first
dtach -n /tmp/drives-worg-session drives mirror --live . bpb1bq6sdfajw4bok7k9tdmrq153pbwzcyfkrqrfxw3hhihyddhy # From output of `drives touch`&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that &lt;a href=&quot;https://github.com/holepunchto/drives/?tab=readme-ov-file#mirror-any-drive-into-another&quot;&gt;&lt;code&gt;drives&lt;/code&gt; ignores the &lt;code&gt;.git&lt;/code&gt; folder&lt;/a&gt; out of the box.  Running
the command inside a &lt;code&gt;dtach&lt;/code&gt; session is a quick and dirty way to make
the process persist after we've disconnected from the VPS.  A better
approach would be to write a service file to register the &lt;code&gt;drives&lt;/code&gt;
process with the init system (Debian 12 uses &lt;code&gt;systemd&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;To automatically pull the latest changes from the remote &lt;code&gt;worg&lt;/code&gt;
repository, add a cronjob with &lt;code&gt;crontab -e&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;30 0 * * * git -C ~/worg pull&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Voilá!  &lt;code&gt;worg&lt;/code&gt; is now continuously mirrored to a hyperdrive, which can
be explored, linked to, transcluded, and more using &lt;a href=&quot;https://ushin.org/hyperdrive/hyperdrive-manual.html&quot;&gt;hyperdrive.el&lt;/a&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;hyper://bpb1bq6sdfajw4bok7k9tdmrq153pbwzcyfkrqrfxw3hhihyddhy/&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you're viewing this file in Emacs with &lt;code&gt;hyperdrive.el&lt;/code&gt; installed,
follow this link to view the &amp;quot;Introduction to Org-Mode and Worg&amp;quot; in
the hyperdrive mirror:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;hyper://bpb1bq6sdfajw4bok7k9tdmrq153pbwzcyfkrqrfxw3hhihyddhy/index.org#%3A%3A%2AIntroduction%20to%20Org-Mode%20and%20Worg&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I hope this helps you.  Feel free to &lt;a href=&quot;../contact.md&quot;&gt;contact me&lt;/a&gt; with suggestions,
corrections, or questions!&lt;/p&gt;</content></entry><entry><title>Sourcehut Org Mode README</title><id>https://breatheoutbreathe.in/posts/sourcehut-org-mode-readme.html</id><author><name>Joseph Turner</name><email>contact@breatheoutbreathe.in</email></author><updated>2024-12-10T12:00:00Z</updated><link href="https://breatheoutbreathe.in/posts/sourcehut-org-mode-readme.html" rel="alternate" /><content type="html">&lt;p&gt;Out of the box, Sourcehut only renders &lt;code&gt;README&lt;/code&gt;, &lt;code&gt;README.md&lt;/code&gt;, and
&lt;code&gt;README.markdown&lt;/code&gt;.1&lt;/p&gt;&lt;h1&gt;Workarounds to render &lt;code&gt;README.org&lt;/code&gt;&lt;/h1&gt;&lt;p&gt;One proposed workaround is to export &lt;code&gt;README.org&lt;/code&gt; to &lt;code&gt;README.md&lt;/code&gt; (in a
git hook), and then commit &lt;code&gt;README.md&lt;/code&gt;, which will be rendered as HTML
on &lt;code&gt;git.sr.ht&lt;/code&gt;.  Another option is to &lt;a href=&quot;https://man.sr.ht/git.sr.ht/#setting-a-custom-readme&quot;&gt;set a custom README&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Here's how we render the &lt;a href=&quot;https://git.sr.ht/~ushin/hyperdrive.el&quot;&gt;README for hyperdrive.el on git.sr.ht&lt;/a&gt; by
setting a custom README:&lt;/p&gt;&lt;h2&gt;Makefile + build script&lt;/h2&gt;&lt;p&gt;The Elisp for exporting &lt;code&gt;README.org&lt;/code&gt; to HTML goes in a Makefile, which
simplifies the packaging process, since there's no extra &lt;code&gt;.el&lt;/code&gt; file
for linters and compilers to complain about.  Credit for &lt;a href=&quot;https://git.sr.ht/~ushin/hyperdrive.el/commit/727f1b4b145c777dc5080312b08dc2c8d019a591&quot;&gt;the idea to
use a Makefile&lt;/a&gt; goes to &lt;a href=&quot;https://emacsair.me/&quot;&gt;Jonas Bernoulli&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Add a file called &lt;code&gt;Makefile&lt;/code&gt; at the root of your project
(&lt;a href=&quot;https://git.sr.ht/~ushin/hyperdrive.el/tree/master/item/Makefile&quot;&gt;hyperdrive.el Makefile&lt;/a&gt;):&lt;/p&gt;&lt;pre&gt;&lt;code&gt;EMACS := emacs
EMACSQ := $(EMACS) -Q
BATCH := $(EMACSQ) --batch \
          --eval '(setq vc-handled-backends nil)' \
          --eval '(setq org-startup-folded nil)' \
          --eval '(setq org-element-cache-persistent nil)' \
          --eval '(setq gc-cons-threshold (* 50 1000 1000))'

README.html: README.org
        $(BATCH) --find-file $&amp;lt; --eval &amp;quot;(require 'ox-html)&amp;quot; \
          --eval '(org-html-export-to-html nil nil nil t)'&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The build script installs &lt;code&gt;hut&lt;/code&gt; and &lt;code&gt;emacs&lt;/code&gt;, clones your repo, exports
&lt;code&gt;README.html&lt;/code&gt;, and sets the custom README.  Add a file called
&lt;code&gt;readme.yml&lt;/code&gt; in the &lt;code&gt;.builds/&lt;/code&gt; subdirectory of your project
(&lt;a href=&quot;https://git.sr.ht/~ushin/hyperdrive.el/tree/master/item/.builds/readme.yml&quot;&gt;hyperdrive.el .builds/readme.yml&lt;/a&gt;):&lt;/p&gt;&lt;pre&gt;&lt;code&gt;image: archlinux
oauth: git.sr.ht/REPOSITORIES:RW git.sr.ht/PROFILE:RO
packages:
  - hut
  - emacs-nox
sources:
  - https://git.sr.ht/~ushin/hyperdrive.el
tasks:
  - update-readme: |
      cd hyperdrive.el
      make README.html
      hut git update --readme README.html&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I hope this helps you.  Feel free to &lt;a href=&quot;../contact.md&quot;&gt;contact me&lt;/a&gt; with suggestions,
corrections, or questions!&lt;/p&gt;&lt;h1&gt;Acknowledgements&lt;/h1&gt;&lt;p&gt;Thank you to Thorben Günther, for &lt;a href=&quot;https://git.xenrox.net/~xenrox/custom-readme&quot;&gt;this example git repo&lt;/a&gt; which shows
how to set a custom README.&lt;/p&gt;&lt;h1&gt;Footnotes&lt;/h1&gt;&lt;h4&gt;1&lt;/h4&gt;&lt;p&gt;Requests for Org-mode README rendering support on git.sr.ht:
&lt;a href=&quot;https://lists.sr.ht/~sircmpwn/sr.ht-discuss/%3Cfe7aa296-9c90-463d-b4e6-50eeb7e57428@localhost%3E&quot;&gt;Mar 2020&lt;/a&gt; &lt;a href=&quot;https://lists.sr.ht/~sircmpwn/sr.ht-discuss/%3C5a7e210f869589d6abd0c0b165192b32c6325068.camel@zaclys.net%3E&quot;&gt;Feb 2021&lt;/a&gt; &lt;a href=&quot;https://lists.sr.ht/~sircmpwn/sr.ht-discuss/%3C8830212A-2DDD-4BCA-AB0C-534D9B6B1EC7@traduction-libre.org%3E&quot;&gt;Oct 2021&lt;/a&gt; &lt;a href=&quot;https://lists.sr.ht/~sircmpwn/sr.ht-discuss/%3C87fsp4szx5.fsf@complete.org%3E#%3C87fsp4szx5.fsf@complete.org%3E&quot;&gt;Jan 2022&lt;/a&gt; &lt;a href=&quot;https://lists.sr.ht/~sircmpwn/sr.ht-discuss/%3Cm2wndqpgdf.fsf@New-Vulcan.localdomain%3E#%3Cm2wndqpgdf.fsf@New-Vulcan.localdomain%3E&quot;&gt;June 2022&lt;/a&gt; &lt;a href=&quot;https://lists.sr.ht/~sircmpwn/sr.ht-discuss/%3C87sez21jhj.fsf@gilgamesh.mail-host-address-is-not-set%3E#%3CD0Z8J5N4PLG0.14FO1M1WUQO7C@cepl.eu%3E&quot;&gt;May 2024&lt;/a&gt; &lt;a href=&quot;https://lists.sr.ht/~sircmpwn/sr.ht-discuss/%3C87cyib79ad.fsf@%3E&quot;&gt;Dec 2024&lt;/a&gt;&lt;/p&gt;</content></entry></feed>