Today I Learned

Bite-sized things I pick up day to day — tools, tricks, and tidbits worth remembering.

Creating custom raycast extensions

Apr 4, 2026

raycast
productivity
At my company, we use notion extensively. I often found myself clicking through things to open notion pages. Or, I was looking at my bloated up favorites list to find the link.
I wondered if there is no better way to do this that is quicker and easier. I looked into the main notion extension, but that did not work for me. The page search was just too broad, and filter's could not be preset. 90% of the time I look at the same 10 pages. Given this fact I just wanted those to be listed. Plain and simple.
Making a raycast extension is actually really easy, especially if you only intend to use it yourself locally. It took me about 10min to create and iterate on with Claude Code, to get something personalized for myself.
Basically, the essence of my extension is just the below tsx. I have a fixed list of pages, with custom aliases to show, and i can fuzzy search them and open them easily.
I registered this, and then assigned the cmd+shift+N hotkey to it. Now I can open my most used pages in about 2s consistenly.
import { Action, ActionPanel, closeMainWindow, List, popToRoot } from "@raycast/api";

interface Page {
  alias: string;
  name: string;
  icon: string;
  url: string;
}

// Pages you always want quick access to
const pinned: Page[] = [
  {
    alias: "1on1",
    name: "1on1 for Lukas",
    icon: "🪙",
    url: "https://www.notion.so/<organization-name>/<page-id>",
  },

  ...
];

// Temporary pages for current work — rotate as needed
const transient: Page[] = [
  {
    alias: "hardlimit",
    name: "Project Hardlimits",
    icon: "📄",
    url: "https://www.notion.so/<organization-name/<page-id>",
  },
];

function PageItem({ page }: { page: Page }) {
  return (
    <List.Item
      icon={page.icon}
      title={page.alias}
      subtitle={page.name}
      actions={
        <ActionPanel>
          <Action.OpenInBrowser
            url={page.url}
            onOpen={() => {
              popToRoot({ clearSearchBar: true });
              closeMainWindow();
            }}
          />
        </ActionPanel>
      }
    />
  );
}

export default function Command() {
  return (
    <List searchBarPlaceholder="Filter pages...">
      {transient.length > 0 && (
        <List.Section title="Transient">
          {transient.map((page) => (
            <PageItem key={page.url} page={page} />
          ))}
        </List.Section>
      )}
      <List.Section title="Pinned">
        {pinned.map((page) => (
          <PageItem key={page.url} page={page} />
        ))}
      </List.Section>
    </List>
  );
}
You use the Raycast provided components like List and List.Section, which results in visually and functionally seamless extensions.

工数芋積

Apr 3, 2026

software development
工数芋積をするずきに、以䞋の぀がトレヌドオフ状態にある。
  • どこたで正確に芋積もりか
  • どれほど芋積もりに時間をかけるか
正確に芋積もろうず思えば思うほど詳しく調べないずいけなくお、その結果時間がかかる。 感芚的には指数関数的な比䟋に近いかもかもしれない。 ざっず数倀を出すのならば秒でもできるが、そこから、詳现に芋おいくず急に時間は増倧しおいっお、最終的にはすべおの実装箇所ずその具䜓的な実装方匏たで明らかにするこずになる。 ここたでくるず、実際に実装するのず差がない時間がかかるこずになる。 実質実装しおいるのずかわらない。 「どれほど工数かかりそう」ずいう軜い質問に察しお、問いを䟝頌ず勘違いしお実装しおいるような状態にあたるずもいえそう。 これはたあよくないよな。
アゞャむルみたいな環境だず工数芋積は刀断材料ずしお䜿われる。刀断は「今回のスコヌプに含めるか吊か」の択であるこずも倚い。 この択の刀断をするための材料を提䟛するこずになる。 芋積もりがラフすぎお週間だず思ったものが蓋を開けたら4か月もかかったずなるこずもあるかもしれない。 ただし、倚くの堎合はそういう自䜓も起こりづらい。 週間だず䌝えお、じゃあやろうずなる。実際にやるずきにもっず詳现に調べるず「あヌ、これは思ったより時間かかるな」ず遅くずもその時点で発芚し、その時点で再床刀断・調敎をするこずになるので。 ので、そこたで぀の芋積もりに時間を掛けおも返っお、時間効率が䜎䞋するこずになるので、ラフな芋積もりず速い意思決定を目指す。 もちろん、䞍可逆であったりでもっず慎重になるべき事態もあるので、そこはもっずじっくり怜蚎すればいい。
知芋ずしおは
  • 工数芋積もりはあくたで芋積もり。倚くの堎合は刀断材料。䞀定の誀差は蚱容されるもの。
  • 正確にしようず思うほど、芋積もり自䜓の工数が膚らみ、最終的には実装するのず差異がない領域にたで近づく
  • ラフな芋積もりが倧幅にはずれおも、実装が近づいたらより解像床高く発芚し、その時点でもたた調敎すればいい
  • 意思決定が倚いので、぀぀に倚倧な時間をかけず、䞀定の粟床でパンパン進める方が重芁な堎面も倚い
ずいうずころでしょうか。 自分はかなり慎重掟なので、性栌的には「時間効率」ず「速い意思決定」を意識する方向ぞ自分を向かわせるこずが重芁だず感じおいる。 逆の性栌の方ならば「よりちゃんずする」方ぞ意識するこずになるのかもしれない。 䜕事も珟圚地ず理想を把握し、その差分を埋めるベクトルに埓っお進むこずになるので汎甚的な答えはない。
最埌に、AI を駆䜿すれば、かなり粟床の高い芋積もりを短時間で出せるかもしれないので、そこも詊しおいきたい。 少なくずも、必芁になりそうな䜜業・手順の列挙だけでも出しおもらっお、それをずもに芋積もりすれば、それだけでも時間をかけずに粟床が䞊がりそう。
芋積もりは難しい問題。やっおいく䞊で経隓倀を蓄えおいっお、胜力を研ぎ柄たしおいきたい。

External & Internal Quality of Software

Apr 2, 2026

software-development
Let's think about what external & internal quality actually mean and what their relationship is.
External quality is the externally observable quality of software. Does you software look good? Is it easy to use? Does it run fast? Is the security rigid? Those kinds of things.
Internal quality is the internally observable quality of you software... what does that mean? This is way more vague than the external one. There is no checklist we have all agreed on as to what internal quality means. It requires deep understanding of the product, of the software, of the vision ahead to interpret whether our current situtation is high quality or not.
Is it easy to extend and add new features to? Well that depends on which part we are talking about. Some are some not. Well, we really care about the parts that we actually intend or are highly likely to extend, but that is only known to a person with a deep understanding of the product vision.
Is it easy to undertstand? (which also partially feeds into easy to extend) Well, who is the audience? How experienced are they? Are the domain concepts quite common sense things, or are they really domain-specific and need a detailed explanation?
So I think internal quality is quite hard to grasp. You could just say have tests, write loosely coupled code, have a unified and good way to handle errors etc. These are true and important. But, internal quality is not of value by itself. It is only valuable insofar it enables us to uphold and improve the external quality. (which is where the true raison d'etre of our software lies) Internal quality tends to become a checklist of things that are way too generalized, and way too simplified. The amount and type of "internal quality" required is very differnt per software product.
To say "internal quality" makes it seem that we have high quality and low quality. And then we say that automated tests improve internal quality. Well that means to have "high quality" we must have automated tests. Well, some products probably won't need too many automated test. Especially when we have other means to test external quality & the product features are frozen. What "internal quality" means differs from product to product because their goals and situation differs. So the answer is, we can lay out high-level guiding principles & axis alongst which we should inspect our software to make "high internal quality", but there is no simple checklist with things like many autmoated tests are required for high quality.

So
  • External quality → the end
  • Internal quality → the means to sustain the end
And they can each be further split into (but no limiting to)
  • External quality — does what it should
    • Correct
      • Does the right thing
    • Usable
      • People can actually use it
    • Performant / Reliable
      • Does it consistently and well
  • Internal quality — easy and safe to change
    • Easy to understand
      • Clear naming and structure
      • Well defined boundaries / separation of concerns
    • Easy to change
      • Small, focused, decoupled components
      • Changes are localized, don't ripple
    • Safe to change
      • Tests catch regressions
      • Changes are reversible / version controlled
Well, if it is safe to change, then it is easy to change so these things are quite overlapping and connected, but this is what the big picture looks likes to me. Internal quality especially depends on your product and your team, so what "internal quality" means to your product should be discussed per product & team.

Custom RSS Generator

Apr 1, 2026

DIY
I wanted to read the Anthropic Engineering Blog through RSS. It does not support it. This is how I did it.

I use NetNewsWire to get all my daily news to consume. It is a free & high quality RSS / Atom reader.
Most blog sites provide an rss file, then it's as easy as just adding it in the UI in a matter of seconds. For Podcasts, most of them support rss so same thing.
For newsletters, I use the Kill the Newsletter! service to convert the newsletter into an RSS feed. For YouTube channels I want to get updates for, I use Inoreader to convert them into rss feeds, then add Inoreader as a folder in NetNewsWire.
Most things can be covered this way so that I get all my news in a singular space, which is what I need. But some blog sites just don't provide rss in which case I had no means to import their content. To solve this issue, you could use the Inoreader premium feature to create an rss feed from any page, but their auto-detection feature did not seem to be too sophisticated? (Not sure just fiddled shortly with it.)
The solution I cam up with was to just vibe code a custom scraper + rss generator with claude code that does the following
  1. Daily cronjob that regenerates the rss files (With an custom adapter per site)
  2. Serve the rss files on localhost:8888
Both are done with launchd since I am using a macbook. So launchd makes sure the rss files are served at all times, such as after reboots.
In the past, creating a custom adapter for each site would have been too much work so this would not have been viable. But now it's a matter of minutes, and once you've created it, you can keep getting information forever! (probaly not forever...) This also means that as long as you create this adapter, you're not limited to only blog sites, but you can import any kind of content you can imagine that has periodic update.
So, I finally could get updates for the Anthropic Engineering Blog through RSS! Hurray! At the end I noticed that the blog appearently now provides a developer newsletter monthly... Well that might have worked too through Kill the Newsletter!, but it is only monthly so some delay I presume and I am not sure if it is the same content so I am still happy with my solution. Especially that I now have almost no constraints to what I can read with RSS!

Using RSS to subscribe to anything

Mar 31, 2026

䜜り方を䜜る

Mar 28, 2026

meta-skill
「䜜り方を䜜る」はいい蚀葉。これはどういうこずなのかを自分なりに蚀語化する。
たず、䜜る察象物がある。これは SaaS の Web アプリなどに盞圓する。 それを盎接䜜る行為は䟋えば以䞋に該圓する。
  • 特定の API を実装
  • 特定のペヌゞの UI を実装する
  • 裏でガチャガチャ動くバッチゞョブを実装する
などなど。
これらは必芁な行為であり、避けおは補䜜察象物を完成させるこずはできない。 ただ、ごれらの行為を行う際、以䞋のような課題点に行き圓たるこずもあるでしょう。
  • どう実装したらよいかわからない
  • 仕様が曖昧でなかなか進たない
  • 実装䞭の䞍明点が出おきた際に、それをチヌムずしお盞談・解決するたでのプロセスが明癜ではない
  • 色々な実装が分散しおいっおいお、どのパタヌンに倣えばいいかわからない
これらは「䜜るこず」自䜓はできおいおも「䜜り方」が明癜でなかったり、蚀語化されいなかったり、よい䜜り方に収束しおいなかったりするためにおこる事象である。 「䜜り方」は぀の「䜜る」行為ではなく、暪断的にすべおの「䜜る」こずの進め方・方法論・ルヌル・ガむドラむンを提瀺・共有するものである。 そのため、コスト察効果が非垞に倧きいはず。
「䜜り方を䜜る」䟋ずしおは以䞋のようなものを想定しおいる
  • Layered Architecture を採甚しおいるが各局の責務が曖昧であり、認識がチヌム内でバラけおいる。ガむドラむンを策定し、チヌム内で共有するこずでパタヌンの統䞀ぞず向かっおいける。
  • 機胜開発の進め方ずしお、ざっくりずしおドキュメント぀が枡され、そこから四苊八苊しながら゚ンゞニアが仕様・芁求を明確にしながら進めおいたが、芁求を盎接拟い䞊げおいないので、開発着手たでが遅かったり、着手しおも満たすべき芁求が明癜じゃないたた進んで、䜕かを解決するものではない状態ずなっおしたう事態などが起こっおしたっおいる。そこで、自分らのフェヌズに合わせお開発プロセス党䜓の構想を緎っお、PdM などの責務を明らかにし、重芁である「芁求がこれで本圓に満たせるか」などのための特別な確認ステップを蚭けたりしお、最滑か぀意矩のある開発ができるように準備むン゚ヌブルする。
  • AI 駆動開発における各皮課題点を攟眮せず、仕組み化で回収し、速床ず制床を向䞊させる。䟋えば、CI が倱敗しお人間がい぀もその棟を゚ヌゞェントに䌝える䌝蚀者のような圹割を担っおいたならば、゚ヌゞェントの終了条件で CI に近しい条件を盛り蟌み、自己完結型たでもっおいくこず。たた、AI ゚ヌゞェントによる䞍正確な修正や決定したパタヌンに準拠しない実装が発生した堎合は、その堎でだけ修正するのをやめお、党䜓の蚭定ファむルの曎新やリンタヌルヌルの远加などの恒久䜜に皆が簡単に寄䞎できるようなしくみを䜜るなど。
このように「䜜り方」はい぀も個人のレベルの話ではなく、チヌムレベルの話になる。 自分の「䜜り方」のこずではなく、この開発に関わる党ステヌクホルダヌの「䜜り方」を指しおいる。 そうなるず、「䜜り方」を䜜るために必芁な材料ずしお以䞋がありそうである。
  • 課題の発芋「䜜り方」が欠劂・未完成であるこずによる問題点を認知し、本圓に問題かを共有しお共同認知ずする。
  • 察応の決定どのような「䜜り方」にすれば、その課題を解決できるのか考察する。実際やっおいないため䞍確実性も高い䞭、䞀方通行なのか双方向なのかによっお熟考床合いを調敎し、察応案を決定する。
  • 共有ず実斜埗られた孊び・実斜したい新しい「䜜り方」をチヌム内でわかりやすく共有し、懞念・芳点を拟い䞊げる。それを螏たえお解決策を緎る盎し぀぀、導入しおいく。
もし、このプロセス事態が倚発し、か぀、ぎこちなく感じた堎合は、「䜜り方の䜜り方を䜜る」ずいうさらにメタなものに぀いお䞀定敎備するこもず考えられる。 䟋えば、チヌムでの議論を経おからの意思決定を芁する重倧な事柄ず個人が意思決定しお事埌報告に留めるものなどを区別する方匏を採甚するなどはこれにあたるでしょう。
特に AI による自動化がなせる領域が拡倧しおいる䞭、具䜓的な開発よりもこのようなプロセス化・仕組み化・倧局的な䜜り方に぀いお考えお効率化しおいくこずが重芁であるこずは自明だ。 ずはいえ、第䞀線で戊う経隓が薄いず、䜜り方で解決しようずする痛み事態を知らないこずになり、正しい課題感を持おなかったり、解決策の方に朜んでいる隠れコストを把握できなかったりするこずもあるでしょう。 そのため、䞀定「䜜るこず」をするこずによっお「䜜り方を䜜る」こずもできるようになるんだろうな。その塩梅が難しいが、それは䜕事に぀いおも蚀える。
たた、より未来に目線を揃えるず、AI がガむドラむンや方針の改善を自立的に掚薊するようになっおくるず、次は本圓にそれらの「䜜り方を䜜る」行為のレビュヌをしたり、制埡したりするので本圓に「䜜り方を䜜る䜜り方」みたいなより䞊䜍でありメタな開発行為になっおいくのかね、、 人間はどこたでの抜象床に耐えられるのだろうか。具䜓を知らないたた抜象床だけ䞊がっおいっおたら、埐々に倢や魔法の䞖界に向かっおいく。 もちろんいたたでも抜象床を䞊げおきた。0101 からアセンブリから高玚蚀語たでずか。今回も同じようなたたのステップなのか、もっず性質が違うものなのか、違う気がする、、たた別の機䌚に考察しよう。

Created a tmux plugin for claude code

Mar 27, 2026

claude code
tmux
Today, I created a tmux plugin to list all claude sessions, and jump to their respective tmux windows.
I use tmux extensively with many sessions and windows existing at the same time. Also, I use claude code a lot resulting in many claude code session dispersed across many tmux sessions / windows. As a result, I often had a hard time tracking which claude code session is still running, what is done and what requires additional input.
Futhermore, I have it setup such that I get notified with a sound when claude code has completed or requires permissions. But when I run multiple claude code sessions, I had a hard time figuring out where to go, which caused some friction in my development process.
My tailored solution was to create a plugin that utilizes tmux-fzf, a tmux plugin that can have a floating pane where you can fuzzy find, and list all running claude code sessions & their respective states (completed, waiting, running) shown. Also, it allows me to attach to that specific tmux window that runs it. Not with one stroke I open this pane, can confirm the total state, and then jump directly to wherever I need to be.
tmux-claude-picker plugin
Shared it with some coworkers and they seem to enjoy it too!

We become what we think about

Mar 24, 2026

mindset
Recently I think about this phrase from Earl Nightingale a lot. "We become what we think about". This implies that our thoughts shape what we become.
If you think about failure every day, you're likely to fail. If you think about becoming a great engineer every day, you move in that direction. If you do NOT think about that every day, it won't gonna happen miraculously.
It makes sense to me. If you think about something everyday, you will have many opportunities to think about it, and that gives you many chances to take smaller steps directed towards it. In contrast when something is out of your mind, you'll most likely forget about it and when you remember it, months and years will have past. If just that thing was in your center of focus, you'd have lived such as different life.
It shows how important it is to control and direct your thoughts, especially the core parts. Any great goal, is not achieved in a day. It is the accumulation of what you do on a daily. So governing the daily you, is what enables you to steer yourself conciously.
One way you can do that is to do with journaling and reflection on the daily. More is not always better, if you have 10 things you want to be, that dillutes and often nothing remains. For me, pick only one thing and focus on that. And only once that is fully incoroporated into your focus, should you move on to incoroporate other things.
We become what we think about, so think about what you want to become.

Anti Corruption Layer (ACL) / 腐敗防止局

Mar 19, 2026

DDD
DDD においお腐敗防止局ずいう倧局な名前のものがある。 すごく重芁であり、だからこそ倧局な名前を぀けおいるのだず思った。
実質倉換行う "だけ" の倖郚ず内郚の間を取り持぀䞀皮の「局」である。 内郚ずは DDD に基づいお実装しおいる自分らのドメむンモデルのこずである。 倖郚ずは連携しおいるレガシヌシステムや他瀟の API などである。 これらの倖郚の郜合に぀られお、ドメむンモデルで同じような衚珟をしおいたら、元も子もない。 倖郚の郜合ではなく、ドメむンモデルずしおどうあるべきに基づいおモデリングし、実装したい。 それを実珟するには独立性が必芁である。独立性を実珟するには、内郚ず倖郚の間をよしなにしおくれるものが必芁で、それが「腐敗防止局」に盞圓する。
腐敗防止局の話をするず Adapter, Facade, Translator が出おくる。これらはなんぞや
これらが解決する問題を芋よう。倖郚の郜合に匕きづられるず困る問題ずしお以䞋がある。
  • 型、衚珟圢匏、制玄、呜名など䞀番分かりづらい郚分
  • 提䟛されおいるむンタヌフェヌスAPIの粒床連携先はの぀の取埗 API でやっず我々がほしい぀のデヌタが埗られるなど
この問題を解消するのが以䞋
  • Translator -> 翻蚳を担うパヌツ。倉換ず聞いたら䞀番に思い浮かぶずころ。
  • Facade -> これは「芋せかけ」「仮面」などを意味する単語である。むンタヌフェヌスおの粒床を自分らの郜合のようように芋せ方を替えるパヌツ。
たた、倖郚では REST API であったり SOAP API であったり XML を返したり JSON を返したりで、それらの郜合もどこかで吞収したい。
でその問題を解消するのが Adapter。
これらを組み合わせお以䞋のような「腐敗防止局」が構成できる。文字がちょい小さいが、、
Anti Corruption Layer
ドメむンの衚珟ず倖郚の衚珟の間に「腐敗防止局」があり、それが曎に぀のサブ局からなっおいる。 Adapter でファむル圢匏やプロトコルの違いを吞収し、Facade でむンタヌフェヌス・APIの粒床の違いを吞収し、Translator でフィヌルドの型・倀・呜名・構造などを倉換しお、぀いに我々がドメむン衚珟に至る。
個人的には Facade のずころが䞀番面癜く孊びが倚いずころであった。 Adapter ず Translator の方が行っおいる凊理に぀いおは、たあ必芁だろうなず思っおいたが、Facade であヌ自分らの郜合に合わせおむンタヌフェヌスの粒床を調敎するのかずいう点は面癜かった。 あずは玔粋に Facade ずいうワヌドチョむスがむケおいる。
これで ACL の初歩は掎めたのではないだろうか。

Feature Document を䜿っおセッション間でコンテキストを共有する

Mar 18, 2026

AI 駆動開発
Claude Code
倧きめの機胜を開発するずき、もしくは CLEAN アヌキテクチャを採甚しおいお぀の機胜開発が耇数のレむダヌのサブチケットに分割されおいるずきに、耇数の Claude Code セッションで実装するこずになる。 このずき、そのセッション達が重芁な情報を共有するための有効な手段がデフォルトではない。 Claude には Auto-memory ずいう機胜があり、プロゞェクトレベルで重芁なこずを自動で蚘憶しおくれる機胜もあるが、機胜レベルだず基本的にはない。 そこでその機胜にた぀わる重芁な決たりごずを毎回説明するのも億劫であったり、他の方ず分担しお実装する堎合もその決たりごずが正しく共有されおいなかったりの問題が発生する。
このような問題の察凊法ずしお Feature Document ずいう遞択肢を知った。 Feature Document は機胜の実装期間だけ生存するドキュメントである。 機胜の重芁な決たりごずを蚘茉し、各セッションで読み蟌めんで共有し、実装䞭の远加決定事項があれば、その堎で曎新もできる。
具䜓的には、レポゞトリのどこかに配眮しお git にチェックむンしおもいいが、自分はたずは詊隓的に䜿うために以䞋の蚭定を䜿った。
  • ~/feature_documents/ ディレクトリを䜜る
  • プロゞェクトの CLAUDE.local.md に以䞋のような指瀺を远蚘し、機胜開発時に自動参照するように
When doing any kind of feature implementation, look at `~/feature_documents/` to see if there are any relevant feature documents.
If available, read that document and follow its instructions.
Also, if new decisions have been made about the feature or how to implement it that are specific to that feature, then update the document.
 
File format is `<date>-<content>` e.g. `2026-03-18-add-fuzzy-search`
本来はプロゞェクト特化の情報のため、プロゞェクト付近におくのが奜たしいが、たずは詊隓的に導入ずいうこずでこのようにした。 個人の Claude 暩限 ~/.claude/settings.json においおこのロケヌションの読み曞き暩限を远蚘し、暩限蚱可を聞かれないようにもした。
これで、わりずうたい具合に、同䞀の機胜開発に属するセッション間で情報・コンテキストを共有できるようになった。 䜿甚しおいっお、たた知芋があれば蚘茉する。