There are strong indications that Half Life 3 (or at least a Half Life game) is coming soon. Of course, Valve might decide to pan the project, but I wouldn't be surprised seeing an announcement for 2026.
I am very much interested in local-first/only (backend-less) PWAs, and have built a couple of them myself.
Unfortunately, I don't think I have any use for a time-boxing app. Nice work though.
Is there a reason you went with localStorage rather than indexedDB?
One useful thing is supporting 3rd party sync services. One of the apps I built allowed syncing data across devices via Dropbox. I never got Google Drive working, though, their API was horrible to work with in comparison. Is sync support something you've considered?
Yeah — I started with localStorage mostly because FocusBox’s data model is super lightweight (a few task objects + session state). It kept the initial version simple and easy to reason about.
That said, I’ve definitely thought about moving to IndexedDB (or a wrapper like Dexie) if/when I add features like session history or richer analytics.
sync — I’ve been exploring ideas around optional, user-controlled sync (Dropbox or even GitHub Gist). I love your approach of using 3rd-party storage rather than a backend — keeps things local-first but still portable.
how did you handle conflict resolution with Dropbox? That’s one piece I’ve been thinking through for sync.
I've long wanted a scrollable/zoomable desktop, with a minimap that shows the overall layout. Think the UI of an RTS game, where instead of units you move around and resize windows. This seems like something in that direction, at least.
How does Karousel work with full screen applications, e.g., games?
Karousel knows when application wants to be fullscreen and allows it to take the screen. If you use hotkey for "move focus to left/right window" you can even exit fullscreen to see other programs. You can also force any program to fullscreen with a key. This is a pretty good workflow as you can fullscreen something and still keep the layout, just not visibly.
No, I think you misunderstand how it works. The problem is that task 4, as you call it, runs after the navigation triggered by the redirect value.
The the author expects the side-effect -- navigation to a new page -- of the window.location.href setter to abort the code running below it. This obviously won't happen because there is no return in the first if-statement.
*simplified*, the symantics of "await" are just syntactic sugar
const value = await someFunction()
console.log(value);
is syntactic sugar for
return someFunction().then(function(value) {
// this gets executed after the return IF
// something else didn't remove all events like
// loading a new page
console.log(value);
});
> the politicians do a 180 once they get voted to power or forget about them because political promises are worthless and non-binding, meaning they lied themselves into power.
Why is this allowed? Why aren't there laws in place to hold politicians accountable for the promises they make to get elected?
After starting my new job and coming back to Python after many years I was happy to see that they had added `match` to the language. Then I was immediately disappointed as soon as I started using it as I ran into its weird limitations and quirks.
Why did they design it so poorly? The language would be better off without it in its current hamstrung form, as it only adds to the already complex syntax of the language.
> PEP: In most other languages pattern matching is represented by an expression, not statement. But making it an expression would be inconsistent with other syntactic choices in Python. All decision making logic is expressed almost exclusively in statements, so we decided to not deviate from this.
> We've had conditional expressions for a long time.
Also, maybe most other languages represent it as an expression because it's the sane thing to do? Python doing its own thing here isn't the win they think it is.
The Python core team has kind of run the language off the rails post 3.7 or 3.8 or so. There's been so much crap bolted on to the language for dubious reasons, and often times it comes with whole new sets of weird problems without really making life easier (async was a quintessential example of this in my mind). There's a lot of design choices core to the language itself that make it a poor choice for many tasks, but that never stops anyone from doing it anyways and bolting on lots of chincy "features" along the way.