Skip to content

Commit ce0ebf1

Browse files
author
ComputelessComputer
committed
add mdx blog posts and render pages
1 parent ec8b383 commit ce0ebf1

6 files changed

Lines changed: 369 additions & 7 deletions
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
title: A calmer daily planning loop
3+
summary: Planning works best when the system carries state for you. Your job is to make decisions, not reconstruct context.
4+
publishedAt: 2026-02-12
5+
---
6+
7+
Daily planning often feels harder than it should.
8+
Not because decisions are impossible, but because context is fragmented.
9+
10+
You wake up and ask:
11+
12+
- what was in flight
13+
- what slipped yesterday
14+
- what repeats today
15+
- what needs a custom tool right now
16+
17+
## One timeline helps
18+
19+
Philo keeps tomorrow, today, and past notes in one continuous timeline.
20+
Unchecked tasks roll forward automatically.
21+
Recurring tasks return on schedule.
22+
23+
The page already knows enough when you open it.
24+
25+
## Fewer transitions
26+
27+
Every context switch is friction.
28+
A calmer loop comes from doing more in one place:
29+
30+
1. write the plan
31+
2. check progress
32+
3. generate a utility if needed
33+
4. continue without leaving the note
34+
35+
## What calm means
36+
37+
Calm does not mean passive.
38+
It means reduced overhead.
39+
40+
You should spend your energy choosing what matters, not rebuilding state from scratch each morning.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
---
2+
title: From recurring tasks to recurring systems
3+
summary: Recurrence is not about reminders. It is about reducing decisions you never needed to make again.
4+
publishedAt: 2026-02-20
5+
---
6+
7+
A recurring task is usually treated as a scheduling feature.
8+
In practice, it is a system design feature.
9+
10+
When a task reappears automatically, you remove one tiny planning decision from tomorrow.
11+
That sounds small until you do it for dozens of routines.
12+
13+
## Good recurrence is boring
14+
15+
The best recurring task behavior should disappear into the background:
16+
17+
- check something off
18+
- trust it will come back when it should
19+
- continue planning
20+
21+
No maintenance. No fragile rules.
22+
23+
## Tag-driven recurrence
24+
25+
Philo uses inline tags like `#daily`, `#weekly`, and `#3days`.
26+
The task carries its own recurrence logic, right where you wrote it.
27+
28+
That keeps behavior obvious and editable in plain text.
29+
30+
## Outcome
31+
32+
The value is not a prettier checklist.
33+
The value is a calmer planning surface where recurring obligations manage themselves.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
title: The case for disposable widgets
3+
summary: Most tools are over-built for one-time problems. We think widgets should be cheap to create and easy to throw away.
4+
publishedAt: 2026-02-16
5+
---
6+
7+
A lot of software assumes permanence.
8+
You open a project, structure data, configure fields, and maintain it forever.
9+
10+
But many needs are temporary:
11+
12+
- a quick travel checklist
13+
- a one-week experiment tracker
14+
- a launch countdown
15+
- a small calculator for one decision
16+
17+
## Disposable by default
18+
19+
Philo lets you generate a widget inline from a note.
20+
If it is useful once, great.
21+
If not, delete it and move on.
22+
23+
No setup tax.
24+
No guilt about abandoned tools.
25+
26+
## Keep the winners
27+
28+
Some generated widgets become recurring utilities.
29+
Those can be saved into a small library and reused later.
30+
31+
This gives you both speed and selectivity:
32+
33+
- fast creation for exploration
34+
- deliberate saving for durable value
35+
36+
## Product principle
37+
38+
Make creation cheap.
39+
Make deletion safe.
40+
Only preserve what earns its place.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
title: Why we built a journal that can execute ideas
3+
summary: Notes are cheap to write but expensive to turn into action. We wanted the gap to disappear.
4+
publishedAt: 2026-02-24
5+
---
6+
7+
Most journaling apps are good at capture and weak at execution.
8+
9+
You write an idea, close the note, and then rebuild the same context later in another tool.
10+
That handoff cost is where momentum dies.
11+
12+
Philo was designed to collapse that gap.
13+
14+
## The core bet
15+
16+
A daily note should not only remember what you thought.
17+
It should help you run what you thought.
18+
19+
That means three things:
20+
21+
- tasks should carry forward until finished
22+
- recurring work should reappear automatically
23+
- widgets should be generated inline when a note needs one
24+
25+
## Why this matters
26+
27+
People do not think in tickets all day.
28+
They think in fragments, checklists, and half-built plans.
29+
30+
The journal is the natural place where that raw planning happens.
31+
If execution starts there too, the system feels lighter.
32+
33+
## What we are optimizing for
34+
35+
We are not trying to build another giant workspace.
36+
We are trying to keep your planning loop short:
37+
38+
1. write
39+
2. decide
40+
3. run
41+
42+
That is the product direction for everything in Philo.
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
---
2+
import { getCollection, render, } from "astro:content";
3+
4+
export async function getStaticPaths() {
5+
const posts = await getCollection("blog",);
6+
return posts.map((post,) => ({
7+
params: { slug: post.slug, },
8+
props: { post, },
9+
}));
10+
}
11+
12+
const { post, } = Astro.props;
13+
const { Content, } = await render(post,);
14+
15+
const publishedLabel = post.data.publishedAt.toLocaleDateString("en-US", {
16+
year: "numeric",
17+
month: "short",
18+
day: "numeric",
19+
},);
20+
---
21+
22+
<html lang="en">
23+
<head>
24+
<meta charset="utf-8" />
25+
<meta name="viewport" content="width=device-width, initial-scale=1" />
26+
<title>{post.data.title} | Philo</title>
27+
<meta name="description" content={post.data.summary} />
28+
<link rel="preconnect" href="https://fonts.googleapis.com" />
29+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
30+
<link
31+
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&display=swap"
32+
rel="stylesheet"
33+
/>
34+
</head>
35+
<body>
36+
<div class="ambient"></div>
37+
<main class="shell">
38+
<header class="post-header">
39+
<a class="back-link" href="/">← Back to Philo</a>
40+
<p class="label">Notes from the team</p>
41+
<h1>{post.data.title}</h1>
42+
<p class="meta">{publishedLabel}</p>
43+
<p class="summary">{post.data.summary}</p>
44+
</header>
45+
46+
<article class="post-content">
47+
<Content />
48+
</article>
49+
</main>
50+
</body>
51+
</html>
52+
53+
<style>
54+
:root {
55+
--bg: #f4f4f1;
56+
--bg-soft: #f8f8f6;
57+
--line: #e2e2db;
58+
--text: #252525;
59+
--muted: #646460;
60+
--accent: #5f70d8;
61+
--fs-xs: 11px;
62+
--fs-sm: 12px;
63+
--fs-md: 13px;
64+
--fs-lg: 14px;
65+
}
66+
67+
* {
68+
box-sizing: border-box;
69+
}
70+
71+
body {
72+
margin: 0;
73+
min-height: 100vh;
74+
font-family: "IBM Plex Mono", "SFMono-Regular", Menlo, monospace;
75+
font-weight: 400;
76+
font-size: var(--fs-md);
77+
line-height: 1.6;
78+
background: linear-gradient(150deg, #f6f6f4 0%, #efefeb 100%);
79+
color: var(--text);
80+
position: relative;
81+
}
82+
83+
.ambient {
84+
position: fixed;
85+
inset: 0;
86+
pointer-events: none;
87+
background:
88+
radial-gradient(circle at 5% 8%, #ffffff 0%, transparent 32%),
89+
radial-gradient(circle at 92% 92%, #e8ebff 0%, transparent 38%);
90+
opacity: 0.8;
91+
}
92+
93+
.shell {
94+
position: relative;
95+
width: min(100%, 720px);
96+
margin: 0 auto;
97+
padding: 56px 24px 88px;
98+
}
99+
100+
.back-link {
101+
color: var(--accent);
102+
text-decoration: none;
103+
font-size: var(--fs-sm);
104+
font-weight: 500;
105+
letter-spacing: 0.03em;
106+
text-transform: uppercase;
107+
}
108+
109+
.back-link:hover {
110+
text-decoration: underline;
111+
}
112+
113+
.post-header {
114+
border-bottom: 1px solid var(--line);
115+
padding-bottom: 18px;
116+
}
117+
118+
.label {
119+
margin: 20px 0 0;
120+
color: #3f3f3d;
121+
font-size: var(--fs-xs);
122+
font-weight: 500;
123+
letter-spacing: 0.06em;
124+
text-transform: uppercase;
125+
}
126+
127+
h1 {
128+
margin: 12px 0 0;
129+
font-size: var(--fs-lg);
130+
font-weight: 500;
131+
line-height: 1.6;
132+
}
133+
134+
.meta {
135+
margin: 8px 0 0;
136+
color: #6b6b66;
137+
font-size: var(--fs-sm);
138+
}
139+
140+
.summary {
141+
margin: 10px 0 0;
142+
color: #3f3f3d;
143+
font-size: var(--fs-md);
144+
}
145+
146+
.post-content {
147+
margin-top: 22px;
148+
color: var(--muted);
149+
}
150+
151+
.post-content :global(h2) {
152+
margin: 24px 0 6px;
153+
color: var(--text);
154+
font-size: var(--fs-md);
155+
font-weight: 500;
156+
letter-spacing: 0.04em;
157+
text-transform: uppercase;
158+
}
159+
160+
.post-content :global(p) {
161+
margin: 10px 0;
162+
color: var(--muted);
163+
font-size: var(--fs-md);
164+
line-height: 1.7;
165+
}
166+
167+
.post-content :global(ul),
168+
.post-content :global(ol) {
169+
margin: 10px 0;
170+
padding-left: 18px;
171+
}
172+
173+
.post-content :global(li) {
174+
margin: 6px 0;
175+
font-size: var(--fs-md);
176+
color: var(--muted);
177+
}
178+
179+
.post-content :global(code) {
180+
background: color-mix(in srgb, var(--bg-soft) 80%, #ffffff);
181+
border: 1px solid var(--line);
182+
padding: 1px 4px;
183+
font-size: var(--fs-sm);
184+
}
185+
186+
@media (max-width: 720px) {
187+
.shell {
188+
padding: 40px 18px 62px;
189+
}
190+
}
191+
</style>

0 commit comments

Comments
 (0)