I lied, in fact I just used it to create a couple Slack emojis.
- All operations done fully client-side - no backend, no private data leaves your browser. - Uses machine learning models (MediaPipe Face Detector task) to automatically scale and position glasses on the detected faces. - Extensive customization options for glasses: - Placement of glasses anywhere on the input image (including slightly going outside it). - Change the size of glasses. - No limit on the number of glasses. - Flip the glasses vertically or horizontally. - Customize the direction from which the glasses appear on the image. - Different types of glasses. - GIF output options: - Looping mode. - Number of frames. - Frame delay. - Separate delay setting for last frame. - Output size. - Celebration confetti - Easter eggs.
I've been working remotely for the last >9 years. When using non-verbal communication, it's important that your tone and intent comes across accurately.. Custom emojis became for me part of expressing yourself, creating bonds and camaraderie. I've originally created an MVP of this tool while applying for a exciting new job opportunity. As a showcase of my passion for programming, building teams and creating delightful user experiences. Unfortunately, they were not impressed and ultimately did not offer me the job :( But I wanted to polish it and release it for everyone to use for free, so that you can too "Deal With It"!
I have more ideas for even more features (check GitHub[1]), but wanted to launch it and see what's the feedback and ideas from the community! And if you're looking for a Fullstack Developer with >14 years of experience, with passion for great customer experience (remote work or locally in Iceland), let's chat!
Otherwise incredible. The customization options are much appreciated.
Minor UX notes: - clicking the header doesn't navigate back to the "home" screen - singular page history (so the back button doesn't take you back to the previous page state)
Combined it made it not intuitive for me how to "get rid" of the selection I'd created (I eventually figured it out, but the previous two points were what I intuitively tried first)
Also, glasses can only be black? We demand a color palette for glass colour.
EDIT: wait, I managed to make the glasses come from below
blob:https://emoji.build/50c07035-efb9-4341-9205-30adfd6b088e
I retract my indignation on the one half of my requests, but transfer it doubly so for the request of a colour palette
You can choose different styles of glasses. But, yeah, they're all black-ish. Definitely open to different colors/styles! I've created a new issue with some possible solutions and will look into it: https://github.com/klimeryk/dealwithit/issues/33 (but PRs are welcome too!)
Could you describe in more detail this? I'm not sure I agree that state changes should be pushed to browser history. In my experience this usually leads to confusing user experience. But that might be also just years of conditioning and I'm missing some best practices. So happy to learn more.
Oh, and it would be cool to have an option for the meme text to go under the image too, and to appear in the final frame of motion for the glasses. For now, I can DEAL WITH IT!
Source: I've made way too many GIFs for Telegram.
https://jammaloo.com/DealWithIt/
It uses face-api.js to find the face, and then move the sunglasses over it. It's about a 5 meg model, so it's pretty slow to load. You can customize with a URL, or drag and drop an image on. Resizing the browser also moves the glasses around.
Very happy to see someone take the idea way way way further!
If *after* generating a gif you change the gif size (bigger in my case) the new gif has the sunglasses appear in the same place. But if I change the size first and then generate everything work fine.
Hope I explained it right
Good suggestion - implemented in https://github.com/klimeryk/dealwithit/commit/12c2254e4a1e5f...
> Oh, and it would be cool to have an option for the meme text to go under the image too, and to appear in the final frame of motion for the glasses
Yup, on my radar! Upvote on GitHub: https://github.com/klimeryk/dealwithit/issues/31
> It uses face-api.js to find the face
Yeah, I'm using Google AI's Face Detector [1]. There's Tensorflow's Face Landmarks Detection [2] that looked most promising and accurate. But it had two bugs [3][4] that are blockers. The first one got fixed recently, but the other one is still pending.
[1] https://ai.google.dev/edge/mediapipe/solutions/vision/face_d...
[2] https://github.com/tensorflow/tfjs-models/tree/master/face-l...
The job market is rough. I have no doubt you were considered, and they were interested, but everyone is giving their all right now. Someone likely submitted something even cooler, somehow.
Unhandled Promise Rejection: Error: StartGraph failed: $Service "kGpuService", required by node mediapipe_tasks_vision_face_detector_facedetectorgraph__mediapipe_tasks_components_processors_imagepreprocessinggraph__ImageCloneCalc...
Warnings prior to the error: [Warning] I0000 00:00:1729008143.963000 1 gl_context_webgl.cc:81] Couldn't create webGL 2 context. (vision_wasm_internal.js, line 1087)
[Warning] W0000 00:00:1729008143.966000 1 gl_context_webgl.cc:106] Creating a context with WebGL 2 failed: UNKNOWN: emscripten_webgl_create_context() returned error 0 (vision_wasm_internal.js, line 1087)
[Warning] === Source Location Trace: === (vision_wasm_internal.js, line 1087)
[Warning] third_party/mediapipe/gpu/gl_context_webgl.cc:82 (vision_wasm_internal.js, line 1087)
[Warning] W0000 00:00:1729008143.967000 1 gl_context_webgl.cc:107] Fall back on WebGL 1. (vision_wasm_internal.js, line 1087)
[Warning] I0000 00:00:1729008143.968000 1 gl_context_webgl.cc:81] Couldn't create webGL 1 context. (vision_wasm_internal.js, line 1087)
[Warning] W0000 00:00:1729008143.968000 1 gl_context.cc:1000] OpenGL error checking is disabled (vision_wasm_internal.js, line 1087)
[Warning] E0000 00:00:1729008143.968000 1 gl_graph_runner_internal.cc:252] StartGraph failed: INTERNAL: Service "kGpuService", required by node mediapipe_tasks_vision_face_detector_facedetectorgraph__mediapipe_tasks_components_processors_imagepreprocessinggraph__ImageCloneCalculator, was not provided and cannot be created: emscripten_webgl_create_context() returned error 0; StartRun failed (vision_wasm_internal.js, line 1087)
[Warning] === Source Location Trace: === (vision_wasm_internal.js, line 1087)
[Warning] third_party/mediapipe/framework/calculator_graph.cc:651 (vision_wasm_internal.js, line 1087)
[Warning] third_party/mediapipe/framework/calculator_graph.cc:682 (vision_wasm_internal.js, line 1087)
[Warning] third_party/mediapipe/framework/calculator_graph.cc:551 (vision_wasm_internal.js, line 1087)
[Warning] research/drishti/app/pursuit/wasm/graph_utils.cc:87 (vision_wasm_internal.js, line 1087)
Hope that helps!Edit: tested on M2 and Safari 18.0 and I cannot reproduce it. Updating now to 15.0.1 to see if that makes a difference.
yeah by recycling their project from a previous interview and adding more to it
I just don't engage in that kind of assessment anymore, the job market isn’t thaaaat tough to need to compromise
or, put another way, jumping through that hoop will not solve your interview progress as its just far too subjective. other hoops are just as fine
[1]: https://giphy.medium.com/the-secret-giphy-slack-commands-9cb...
> There are only two hard things in Computer Science: cache invalidation and naming things.
* Found it, there is a small indicator in bottom right of glasses that allows dragging out to resize. Thanks all!
Hire.
Interviewed another Dev who made arcade sticks as a side project.
Hired.
You can't teach passion. Hire all that passionate people you can. Tech stacks are irrelevant compared to the love of building things.
When they give feedback, they love getting on their soapbox and critiquing others as if they were Olympic judges or something.
I’ve had to hold myself back from saying bro we wouldn’t hire you yourself if this criteria actually had to be met.
Some hiring managers require all this elaborate prep work and it’s such bullshit, imo it’s a total cop out to have people do so much work as part of the interview process.
It’s the lazy way of evaluating someone versus thoughtfully putting together a good hiring process and conducting effective interviews.
Fortunately, these days if you wanted to make it more obvious you could hook up a regular Share button to navigator.share() API and pass it your image blob.
I was not hired once because I didn't have React experience, despite having years of both Vue and Angular and having led teams building non-trivial apps in both. IME focusing on such a minor detail like that means either a) you're going to be so pressured to get stuff out of the door they can't handle slightly lower productivity for a month while you learn the different syntax, and/or b) the person hiring you isn't technical enough to know this is a minor detail.
Either way, better off somewhere else :)
Just as something to be a quick "oops, didn't want to use that image, I want to go back to how the site is when I first visited it", and essentially wipe the state.
The history stuff is secondary, since that was my second instinct after trying to find and hit a "home" button, just from my personal UX perspective.
;)
There may be other factors. Hiring is complex. They could have judged tbis fairly and they may have had a better candidate. Having a project like this should probabilistically increase your chances.
[1] https://m.youtube.com/watch?v=fJ9rUzIMcZQ&pp=ygURYm9oZW1pYW4...
if (looping.mode === "off") {
// If you waited for a day, you deserve to see this workaround...
// Since there is no way to not loop a gif using gifwrap,
// let's just put a reeeeaaaaallly long delay after the last frame.
return 8640000;
}
I’m finding it absolutely brutal. I’ve never encountered anything like it. I could be doing something wrong, though.
Only recently started using Discord, and joined various “servers”, which seem as basically just groups with chats. When I was prompted to create my own “server”, at first was hesitant thinking “whoa, I don’t want them to provision a whole server for me, that can’t be cheap”, then realized it has nothing to do with actual servers.
Rather than welcome people to the team to learn from them and grow the team, they criticize and reject people like crazy. It’s very reactive rather than proactive behaviour, and it’s a bad sign to have it at a company.
All thanks to some clever (mis)use of SVG and canvas, see https://github.com/klimeryk/dealwithit/commit/d8f280b5f2e4bd.... Enjoy!
I had a great experience at that company while I was in college, which also launched me into an exciting professional career. All of it wouldn't have happened without people like you.
Graph successfully started running.
Uncaught (in promise) Error: Unsupported MIME type: application/xml
at Et.a (gif.worker-WYu6DU4i.js:23:56331)
at Et.zt (gif.worker-WYu6DU4i.js:23:78271)
This might be caused by my workplace enforcing the Okta chrome plugin :(