Pachi's Avatar

Pachi

@facilethings.com

Software engineer, founder of facilethings.com ๐Ÿ”นLocal-First ๐Ÿ”นReact ๐Ÿ”นRuby on Rails ๐Ÿ”นData Science๐Ÿ”นPython ๐Ÿ”นLinux๐Ÿ”นGetting Things Done

379
Followers
408
Following
724
Posts
13.09.2023
Joined
Posts Following

Latest posts by Pachi @facilethings.com

You can go back at any step and undo the final result.

There's also an option to clarify in a single step (sometimes things are clear from the start).

We used XState to design the state machine that manages the whole process.

10.03.2026 17:47 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0
Video thumbnail

In #GTD, clarifying is the moment when you think, decide, and transform everything your personal inbox into specific, actionable items.

It's a mental process that gives you control by answering a series of questions.

We've implemented the entire process in the new version of FacileThings:

10.03.2026 17:47 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

replicache's sync: In the PULL process you return 4 "put" keys for each database record. The PUSH one remains the same (client mutators need to update several local records at once for local consistency).

Of course, you only do this with certain critical tables (just 2 in our case).

09.03.2026 22:16 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

you need more code to update/delete split records, but replicache executes mutations with atomic transactions. in return, you get much faster readings.

IndexedDB is slow at extracting thousands of records with tens of data points, and using spinners would ruin a local-first application. ๐Ÿ‘‡

09.03.2026 22:16 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

Itโ€™s working for me

09.03.2026 20:13 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

In our case, conflicts are managed by Replicache (replicache.dev), the library we use to sync with the external database.

09.03.2026 20:05 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

Yes, each mutator updates all the keys involved (which depends on the fields updated). This ensures consistency in the app if itโ€™s offline.

09.03.2026 20:02 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

Yes, you need more space and there's data duplicated, but the speed might be unacceptable and the trade-off is well worth it.

This is one of those decisions that feels like over-engineering early on, but local-first apps live or die by how well you model your local store.

09.03.2026 19:22 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

So we added two more keys for each task in the sync process:
- "tasks/s/:state/:id" โ†’ tasks by state, with the needed fields is this case
- "tasks/p/:project_id/:id" โ†’ tasks by project, with the needed fields

Need all the tasks of project 125? Just fetch "tasks/p/125/".

09.03.2026 19:22 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

Getting all the records every time can be slow, even with local data (problem 2). Over the years, users accumulate thousands of tasks.

But you rarely need to get all the tasks. Now you need to think about how you access the data. In our case, it's usually by state, and by project.

09.03.2026 19:22 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

- "tasks/c/:id" โ†’ core fields (title, state, due date, projectโ€ฆ) - "tasks/d/:id" โ†’ detail fields (notes, attachments...)

Want to show cards? You only need to fetch "tasks/c/". Need to edit the whole task? Then you fetch both keys. Pay only for what you use.

09.03.2026 19:22 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

When you're listing hundreds of tasks in a view, you're loading notes, descriptions, attachments, metadata... stuff you don't need yet. That's a fat row problem (problem 1).

Here's how we solved it in FacileThings: split each task into two canonical keys:

09.03.2026 19:22 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

One of the first things you'll face building a local-first app is how to structure your key-value store so you're not pulling more data than you need.

The standard approach is one key per record ("tasks/:id"). It worked. Until it didn't.

We had to solve two problems. ๐Ÿงต

09.03.2026 19:22 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 2 ๐Ÿ“Œ 1

There's a moment in building a product where you stop adding features and start connecting them.

This week was one of those: no new concept, just making an existing flow available from every place the user might need it.

That's often the real work.

#bluidInPublic

08.03.2026 14:32 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0
Preview
Boris Tane The research-plan-implement workflow I use to build software with Claude Code, and why I never let it write code until I've approved a written plan.

I just developed a fairly complex feature using this workflow, and the experience was fantastic. I highly recommend it.
boristane.com/blog/how-i-u...

08.03.2026 10:41 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

nice!

03.03.2026 13:14 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

Thanks! Iโ€™ve also tried a few. Automerge is also strongly based on CRDTs, but Iโ€™ll take a look at Yjs. It looks interesting!

02.03.2026 09:24 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

Which did you like the most?

01.03.2026 19:46 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Post image

Anthropic responds to Hegseth. www.anthropic.com/news/stateme...

28.02.2026 02:15 ๐Ÿ‘ 8511 ๐Ÿ” 2590 ๐Ÿ’ฌ 310 ๐Ÿ“Œ 238

Why learn to code when you can use an LLM and pay a subscription fee for the rest of your life.

19.02.2026 18:32 ๐Ÿ‘ 313 ๐Ÿ” 65 ๐Ÿ’ฌ 23 ๐Ÿ“Œ 10

youโ€™re not alone. itโ€™s crazy

23.02.2026 09:16 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

Even if itโ€™s $9 lol

20.02.2026 13:11 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0

thank you, Travis!

19.02.2026 12:28 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0
Preview
Doing Fewer Things: The First Principle of Slow Productivity and Its Connection to GTD Discover how the

"David Allen taught us that you cannot manage time, you can only manage your actions. Cal Newport adds that not all possible actions deserve to be managed, and that fewer actions managed exceptionally well outperform many actions managed adequately."

facilethings.com/blog/en/doin...

19.02.2026 11:05 ๐Ÿ‘ 6 ๐Ÿ” 1 ๐Ÿ’ฌ 1 ๐Ÿ“Œ 0
Preview
Doing Fewer Things: The First Principle of Slow Productivity and Its Connection to GTD Discover how the

More than enlightening - life changing ! Thank you @facilethings.com
facilethings.com/blog/en/doin...

19.02.2026 06:07 ๐Ÿ‘ 3 ๐Ÿ” 2 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0
Video thumbnail

We have managed to design a task editor in which all the information (text, notes, files, checklist, collaborators, due and start dates, tags, goal, project, focus area, choice criteria) fits on a screen as small as that of the iPhone SE.
#facilethings #gtd #apps

15.02.2026 15:11 ๐Ÿ‘ 2 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0
Waiting is the new interruption AI creates small waiting gaps that break flow. I look at how that adds up and what leaders can do about it.

interesting -> waiting is the new interruption
jennywanger.com/articles/wai...

13.02.2026 15:21 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

i do that every single time. is it prohibited?

13.02.2026 15:02 ๐Ÿ‘ 0 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0

The SaaS you intend to build iwith AI has countless details that it has accumulated over the years of experience that AI will not be able to replicate.

12.02.2026 12:25 ๐Ÿ‘ 1 ๐Ÿ” 0 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0
Preview
Time well spent What an admirable goal. Perhaps the overriding goal of all goals. How often do we measure this? Do we even know how? Do the systems we're in push us from considering this? I wonder why.

Time well spent

What an admirable goal. Perhaps the overriding goal of all goals. How often do we measure this? Do we even know how? Do the systems we're in push us from considering this? I wonder why.

11.02.2026 10:03 ๐Ÿ‘ 3 ๐Ÿ” 1 ๐Ÿ’ฌ 0 ๐Ÿ“Œ 0