HN user

justEgan

150 karma

https://eganbisma.com

https://drive.google.com/file/d/1bChWYu9vI5FzPoXiUX95Oa9PkryXEclW/view?usp=sharing

Posts1
Comments19
View on HN

Working on Kernel, a GSAT vocab study app for Taiwanese students. A lot of exam prep still means paying cram schools for structure and linear repetition. We’re trying to turn that structure into software that knows what you’re about to forget and what to review next.

app store: https://apps.apple.com/tw/app/kernel-%E8%83%8C%E5%96%AE%E5%A...

viral launch post that brought in ~1700 users in 2 days: https://www.threads.com/@sean_hsu_13/post/DW8nBzDjV8T?xmt=AQ...

Location: New York, NY

Remote: Yes

Willing to relocate: Yes

Technologies: JavaScript, TypeScript, React, Vue (2/3), Node.js, Python, C#, GraphQL, PostgreSQL, Redis, MongoDB, Docker, Kafka, Elasticsearch

Résumé/CV: https://drive.google.com/file/d/1bChWYu9vI5FzPoXiUX95Oa9Pkry...

Email: eb852@cornell.edu

Hi, I’m Egan. I’m a Full-Stack Engineer with 6 years of experience, currently finishing my Master's in CS at Cornell Tech. My career has evolved from enterprise environments to high-growth startups where I tackle complex real-time challenges.

At Sociolla, I architected a unified WebSocket-based server cluster supporting 300+ daily active agents, reducing customer response times by 25%. At BRIK, I engineered a real-time collaboration platform using CRDTs to prevent data overrides, improving team efficiency by 30%.

I created KopiMap (https://kopimap.com) to help people discover great cafés in Jakarta Indonesia, but I wanted to take the UX further by automatically organizing user-submitted photos into meaningful categories (menu, food/drinks, ambiance).

The challenge is how to classify images as cost efficient as possible without compromising performance. I decided to go with running ML models on the client-side.

Technical implementation: - Built and trained a compact TensorflowJS model (~3MB) that runs entirely in-browser - Model lazy loads only when users are submitting reviews - Classifies uploaded photos into Menu, Food & Drink, or Vibes (interior/exterior) - Zero server costs for inference, quick enough classification feedback

This approached solved several problems: 1. Reduced server costs by moving inference to the client 2. Improved UX with immediate photo categorization 3. Maintained app performance by lazy loading the model

Would love feedback from the HN community on: - Optimizing the model size further - Alternative approaches to client-side ML - General UX improvements for local discovery apps

I had no prior ML experience, so this was a fun challenge :)

Why not just unsubscribe to any news-related subreddits? And unchecking the "use new reddit as my default experience" while you're at it.

I believe when an extension requires matches permission for say ://netflix.com/, it asks for permission to load the content script to the browser tab that has that URL opened. Which means that even if the extension involves the slightest bit of modification on the UI, it still requires the same permission as one that involves the user's sensitive information. It seems this page suggests that the extension could also read usernames and password: https://support.mozilla.org/en-US/kb/permission-request-mess...

For what it's worth, we can confidently say that our extension does UI modifications without ever being involved with user sensitive info. Regardless, will definitely open source the extension. Hopefully this will win some user's trust. Stay tuned!

The syncing is done automatically, at least mostly.

TL;DR: ScreenplaySubs fetches the subtitles from Netflix, parses the PDF-formatted screenplays into JSON, and syncs by calculating the sentence similarities between subtitle and screenplay dialogue.

In particular, we use the Universal Sentence Encoder for deciding whether a subtitle matches with a screenplay dialogue. If a screenplay dialogue is similar enough with the subtitles, the former will be tagged with the timestamp provided by the latter.

A lot of the underlying problems presented with each step sounds deceptively simple at first, but turns out to be quite challenging and fun to research. E.g. Parsing PDFs in general are not straightforward (https://filingdb.com/b/pdf-text-extraction), and there’s only a handful of resources on parsing PDF screenplays beside a handful of research papers (https://github.com/drwiner/ScreenPy/blob/master/INT17_screen...), which lead us to create our own open source repo for this (https://github.com/SMASH-CUT/screenplay-pdf-to-json).

Our screenplay-pdf-to-JSON converter is able to contain all dialogues, transitions, actions within a particular screenplay scene. With this, we’re treating scenes as atomic, being able to detect changes in scene ordering based on the tagged scene timestamps. This also means if dialogues are swapped within a scene in the movie, there will be some syncing inconsistencies.

Some scenes do have little to no dialogues, which would pretty much cause the extension to work on a best-effort basis. E.g. The opening scene of There Will Be Blood has very minimal if not no dialogue at all. This is the case where I need to jump in and sync up the screenplay manually. OTOH, the opening scene of Inglourious Basterds will work very well, since there are tons of dialogues in it. This is the reason why I can’t just add movies and instantly upload it to the site.

Would you be interested for me to get into more details? I was thinking of writing a series of technical blog posts if there are enough interests!

Thank you, and that's a great idea I've considered for future releases. More specifically, the layout presented in this video looks ideal: https://www.youtube.com/watch?v=HybzbDBF7HQ. Where the screenplay can replace the letterbox at the bottom.

One of the reasons we decided not to implement that for now is to provide a bigger room for error since our algorithm is still not perfect. Sometimes the extension choose to focus on 1 or 2 sentences next to the accurate dialogue. Having an entire viewport height to show the screenplay means even if some inconsistencies occur, the user may still be able to see the accurate dialogue.