5 years ago I took a pay cut of 70% and stopped all consulting work to pursue my dream to become an indie product developer.
It took me 5 years of blood sweat and tears but in 2021 the monthly revenue from my products has finally surpassed my income as a consultant 🎉
📱 TIL about the Visual Viewport API
⌨️ When opening a soft keyboard `window.innerHeight` will stay the same but `visualViewport.height` won't!
📡 Even better, you can listen for `resize` and `scroll` events on the `visualViewport` object.
🎉
I just published a free, mobile friendly, online image editor.
🖼 Drop your image
✂️ Crop it
🎢 Rotate and flip it
📷 Apply filters
🔬 Adjust the color balance
🖍 Add some markup
📐 Resize to your liking
⬇️ Save it!
#webdesign
You can now edit your photos at 🔗
🍪 no cookies to accept
🤹♂️ no popups to close
👤 no account to create
🎯 no ads to ignore
🕵️♂️ no spying on you
✨ 100% free
Paste, browse, or drop your photo and start editing.
I'm super excited to finally launch Doka.js! 😄
✂️ Doka.js is
#JavaScript
Image Editor for your Website.
🕹 Flip, rotate, resize, client-side transforms, Doka handles it all.
🔥 Live on
@ProductHunt
:
Use discount code "ph25" for a 25% discount today 🎉
Don’t do this.
Use `outline` instead of `border`.
Outline doesn’t take up space, border does.
Set color to `rgba(255, 0, 0, .25)` instead of `red` so you can see overlapping outlines more clearly.
@serglotz
@levelsio
It seems this has been fixed for a while now.
Apparently this was only possible on Macs released prior to 2008. Since then the LED is tied to the sensor hardware signal.
Yesterday I tried to create a shiny silver line using the DeviceOrientation sensors. The orientation is mapped to the offset of an SVG radial gradient. It's functional but not very realistic yet.
Just published the first version of Shiny.js, a library to make backgrounds, borders, and text appear to reflect light on mobile devices (devices that support `deviceorientation` events).
#javascript
#css
#webdesign
🔥 CSS tip → Use font-variant when you animate numbers.
.animated-numbers {
font-variant: tabular-nums
}
This applies a uniform width to the numeric glyphs resulting in a smoother animation.
Top: font-variant not set
Bottom: font-variant set to tabular-nums
🗜️ Compressing images before upload.
Instead of bothering your visitors with image requirements, compress them with JavaScript.
Quick read on using <canvas> to compress images and DataTransfer to save images back to the file input from whence they came.
📯 I've crossed the $125,000 worth of sales boundary on
@envato
🍰 I've been selling on Envato for 5 years
📦 Sold 7,919 licenses shared over 11 products
🌟 I've gathered 438 ratings averaging at 4.93 out of 5 stars
💬 Answered a gazillion support requests
Wahoo! 🚀
I finally launched Edit • Photo on Product Hunt! 🛵💨
No pop-ups, no ads, no account, no subscriptions, and no discount codes, because it’s 100% free.
Would love your support ❤️
Reading up on the EU Cyber Resilience Act (CRA).
In short it’s an extensive list of requirements and validations for companies and individuals selling software in the EU.
A lot of time consuming and costly hoops to jump through. Fines up to 15 million Euros.
Oh I forgot. If
✨ I've just Open Sourced Flip Counter
✅ Zero dependencies
✅ Beautiful animations
✅ Auto fits container width
✅ All major browsers supported
✅ JavaScript and jQuery API
👨💻
#webdesign
#ux
#javascript
🔥 The FilePond Image Editor UI is coming together nicely, it's fully powered by CSS transforms and easily runs at a stable 60FPS on my iPhone SE
#javascript
#css
#webdesign
I just published the FilePond source code 🙈✨
Slightly nervous as I the unit tests aren't that great, so if you 💕 writing tests and have time to help out, it would be very much appreciated.
#javascript
@wesbos
It’s not the “it’ll build websites” part that worries me, it’s the “it’ll browse the web for people” part.
When it starts doing that the relevancy of interactivity and design on the web starts plummeting as less and less humans will use it.
The perfect time to start your side project is when you’ve just started learning how to code.
It’s a small window in your career where you only focus on getting stuff done instead of worry about how it’s done.
✨ I got a bit carried away with the shiny DeviceMotion thing. It now works on text, borders, and backgrounds.
I’m cleaning up the API and hope to push version 0.1 to GitHub on Monday.
Last Wednesday I removed Slack, Twitter, Telegram, Reddit, and "business" email from my phone in an effort to be more present.
Went on a city trip to London and spend 15 minutes of screen time to check the weather.
When I checked this morning, my company wasn't on fire.
Life++
CSS nesting is still in draft but might as well get used to the syntax so your selectors are future proof:
🔥 Using Sass? Prefix your nested selectors with &
🔥 Using PostCSS? Use the PostCSS Nesting plugin.
👨💻 TIL you can use `monitorEvents(element)` in Chrome dev tools to log all the element events to console.
📡 Pass event name or group as second argument to filter events.
Log click events: `monitorEvents(element, 'click')`
Log mouse events: `monitorEvents(element, 'mouse')`
🔥 TIL `document.currentScript` returns a reference to the scripts script tag.
Very useful for inline scripts that need access to sibling elements without using id's or classes.
👨💻
Writing smart
#CSS
to show and hide elements on the page.
Store session duration and scroll offset in data attributes on the `<html>` element. Now we can use this data in our CSS. 🔥
html[scroll-y~='50%'][visit-duration~="30s"] {
/* Styles 🙌 */
}
I just trained my own Dreambooth Stable Diffusion model thingy, cause why spend money if you can-do-it-yourself-for-free™
It takes long to train, but takes an even longer to come up with good prompts and wait for results.
Getting dozens of profile pictures for $29 is a steal.
🔊 What does a fieldset sound like?
Group radio buttons together using a `<fieldset>` element and add a `<legend>` to describe the group.
Assistive technology can now tell the user what group the radios belong to.
As an experiment I wrote a new item component for FilePond v5, it uses <canvas> instead of CSS.
Just ran a performance test with 200 file items in a grid. Fully expected it to crash and burn, turns out it's like 50 times faster than using the DOM.
*scratches head*
📱This Sales Widget for
@ScriptableApp
displays your recent
@Gumroad
sales right on your iOS homescreen
🗓 Stats for 7 days
💸 Total income
📦 Total sales
📈 Daily income
📊 Daily sales + recurring sales
🔄 Last update time
🌓 Bright and Dark theme
👉
I hate it but it looks like after 5 years I’m leaving
@gumroad
:/
Incredibly reckless to announce a 300% price hike on Twitter.
No, I didn’t get the email this morning. Also, it’s Saturday.
@iamharaldur
Apparently it’s a battery size thing why there’s no new mini :/
Hope they reconsider, love the mini form factor, but back to 5 size would be even better. 🔥
Switched from using the Drag and Drop API to using plain old PointerEvents (down → move → up).
Turns out simple PointerEvents are faster.
When using Drag events the browser runs hit test logic which it doesn't do with PointerEvents.
As an experiment I wrote a new item component for FilePond v5, it uses <canvas> instead of CSS.
Just ran a performance test with 200 file items in a grid. Fully expected it to crash and burn, turns out it's like 50 times faster than using the DOM.
*scratches head*
📟 I just published short-and-sweet, an accessible character counter, tested with VoiceOver and NVDA
#a11y
#accessibility
#js
#ux
🔧
⚙️ npm install short-and-sweet --save
@levelsio
> Your friends peer pressure you in drinking alcohol “come on, one beer, don’t be so strict”
If they know you don’t drink than it’s time to find new friends.
@csallen
Context: Dad of two, never really wanted kids, but also wasn't against it.
For: They add meaning to life and make you look at yourself and your parents in a completely new light. I love them to bits.
Against: I put them on a planet that's on fire and the guilt is eating me up.
New dev version of Doka Image Editor running on my old iPhone SE 5" ☎️
I redesigned the filters page so it supports grouping. Also added more effects like Clarity and Gamma. Noise and Vignette are on the todo list.
#ux
Doka.js is 1 year old 🎉
📈 $ 5,482.25 in sales this November
🙌 First 4 customers renewed their annual licenses
🤫 Soft-launched Doka for WordPress
👨💻 Set up the PQINA customer portal
A million new plans on the horizon ☀️
#indie
#webdev
It has been 10 years.
Risky ROI is why I switched to the more safe route of selling web components.
I hoped one day to make enough to return for a second attempt.
That day has finally come.
I'm building a new game and I couldn't be more excited 🙌
My new product ideas are constantly hampered by the fact that I don't have a lot of experience writing backend solutions.
What would be the easiest Node / React (or Svelte) based solution to build a very basic SaaS?
Needs:
- authentication
- privacy
- easy to extend
I just published 🎉
✍️ An app to quickly redact photos in your browser.
🤳 Works on both mobile and desktop devices.
🕵️♂️ 100% private. Everything stays in your browser.
🎙️ I was interviewed by IndieHackers on building, launching, and reaching 3K/mo for Doka.js
A bit of history, info about the tech used, sales and visitor numbers, features that were cut, and tips for other makers.
#indiedev
#webdev
#startup
💰 Don't be afraid to raise your prices.
Low prices attract a different audience. If my prices were lower my support requests would not increase linearly. Low price → 2x customers → 4x support.
@wesbos
I feel that when you start out energy is derived from getting things done instead of doing it correctly.
After a while you know you can get things done, and you’ll get more energy from focussing on how you do it.
I feel that’s the point TypeScript should be introduced.
For the past couple months I've been on/off debugging weird flickery movement when dragging a FilePond v5 item to another position. I should've just moved to the next thing on the list, but I've got issues.
This morning I finally figured it out! Turns out I was looking in the