Hacker Newsnew | past | comments | ask | show | jobs | submit | probabletrain's commentslogin

it's an application built with webgl that plays audio, rather than just an audio player

media sound is generally unaffected by the silent mode toggle, which apple suggests is only for notifications. but the toggle inconsistently affects media, muting some things but not others. it's incredibly frustrating. android has much better audio controls for notifications, media, alarms, and vibrate.

> We need Claude and Claude Code, with their skills and plugins, with their context, to be first-class participants in our company's Slack. But this problem can't be solved by a Slack integration because of another problem: data access.

Yes it can? We have agents in Slack as first class participants. They can even use Slack search.


I think there’s a difference between what’s expected/acceptable for library code vs application code. Types like this might be hard to understand, but they create very pleasant APIs for library consumers. I’ve generally found it very rare that I’ve felt the need to reach for more complex types like this in application code, however.

RXJS’s pipe function has a pretty complex type for its signature, but as a user of the library it ‘just works’ in exactly the type-safe way I’d expect, without me having to understand the complexity of the type.


> This whole site smells off vibe coded jank.

A vibe-coded double pendulum sim should produce a much better result than the physics on this page. Claude Code made this just now off one prompt, the physics are much better: https://keir.is/swinging


In an ideal world you'd have one source of truth for what the shape of a User could be (which may well be a discriminated union of User and AnonymousUser or similar).

Without fullstack TS this could look something like: (for a Python backend) Pydantic models+union for the various shapes of `User`, and then OpenAPI/GraphQL schema generation+codegen for the TS client.


The problem with this is that your One True User shape tends to have a bunch of optional properties on it. e.g., in the user profile you fetch Post[], but in the user directory you don't, and so on with other joined properties. If every endpoint returns the One True User, then you end up needing to write conditional logic to guard against (say) `.posts` when you fetch users in the profile, even though you know that `.posts` exists.


In Typescript at least, if the discriminated union is set up correctly, you just need a single check of the type field. That lets TS narrow the type so it knows whether e.g. `.posts` is present or not.


I think I can do this, yes, but it becomes a very large amount of repetitive work.

Let's say I have api/profile (which has `.posts`) and api/user-directory (which does not). I define User as a discriminated union - one has type `user-with-posts` and one has type `user-no-posts`. OK, good so far. But now say I have a photo gallery, which returns photos on user. Now I have to add that into my discriminated union type, e.g. `user-with-posts-and-photos`, `user-with-posts-but-not-photos`, `user-with-no-posts-but-yes-photos`... and it gets worse if I also have another page with DMs...


You can use a string union to discriminate when it makes sense, but that's not the only way to discriminate and in this case you'd instead use the presence of the items themselves (essentially duck-typing with strong type guarantees)

Typescript playground: https://www.typescriptlang.org/play/?#code/C4TwDgpgBACg9gZ2F...


Now you run into the issue I mentioned in GP, where you end up writing `if (blah)` everywhere, even though you know that `blah` is definitely present.


Change the design of the API so that the posts and the photos and so on are not returned inside the user object but on the same level as it.

So {user: {...}, photos: [...]}, not {user: {..., photos: [...]}}.

Alternatively define separate schemas for each endpoint that extend the base User schema. But I'd prefer having the same structure everywhere as much as possible.


Not sure how other stacks solve this, but with GraphQL the backend defines a `User` type with a full set of fields, and the client specifies only the fields it wants to query. And with codegen you get type safety.

So on the /posts page the client asks for `{ user: { id, posts: { id, content }[] } }`, and gets a generated properly-typed function for making the query.


GraphQL is another one, with schema introspection and codegen for queries and types.


> all the photos where shoot with the Leica M11 + 35mm Summilux FLE

These photos look great, but I'm having a hard time figuring out exactly why.

The Barbican certainly looks better here than from what I remember of seeing it through the naked eye.


Whether this was done on-camera or in post, there's color grading happening here. The moody, almost film-like quality present in these pictures is also really popular in high production TV shows right now. Also a good eye for fun compositions, like the shot with the wall/barrier present in the left to offer the feeling of being closed or restricted.

Notice how the shadows are somewhat teal-tinged and the contrast is toned down. There may or may not be some grain or vignetting added in post as well. There are Lightroom color profiles that can get this sort of color feel on application. But the compositions and natural lighting are pure photographer skill to chase.


Good camera + good lens + good photographer + good processing.

Photography is a deeper, more subtle art than a lot of people realize. Two people can take a picture in the exact same location and time and get wildly different results.


It’s hard to explain just how nice Leica lenses can be in the right hands. There is a reason they have a cult like following.


Oh, yeah, but oof the price.


Navigation isn't usually "undo", conceptually.


> Previous sync engines really want you to sync all data

Linear had to do all sorts of shenanigans to be able to sync all data, for orgs with lots of it – there's a talk on that here:

https://www.youtube.com/watch?v=Wo2m3jaJixU&t=1473s


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: