Jason Leow

Indie hacker, solopreneur | Creating a diverse portfolio of products + services.

Day 72 - Learning how to market on Twitter https://golifelog.com/posts/learning-how-to-market-on-twitter-1615624646928

I’d been doing a bit of organic marketing and sharing on Twitter for Lifelog. Some things I’m learning the hard way:

👨🏻‍🎤 Personal vs brand accounts
🤝 Brands lack the human touch, but it’s still possible
📡 Broadcasting content vs engaging
☃️ Cold selling vs warm help
🗓 Consistency vs intensity

What else can I do or should do in terms of marketing for Lifelog? Would love to hear your insights!

Revamped the /community page into a leaderboard gallery

It's a v1.0 of the numbers page that @Lobacrow and @brianball wrote suggestion posts about. This also includes the number of streaks idea, where users are celebrated for being resilient and bouncing back even if their streak broke:

🐣 First joined
🔥Top streaks
🕯 Best streaks
🔁 Most streaks
🎯 Most goals
💬 Most comments
📝 Most posts

Data fetching would be a nightmare for this page if all data needs to be loaded before displaying the page. Felt pretty smart implementing a way to prefetch data upon `@mouseover.once` - so that the data fetching happens (just one time) the moment the user hovers the cursor over the tab presumably to click it next. That few hundred milliseconds shaved off the loading makes a huge difference! Clicking on to the next tab feels instant now. Now hoping that it'll work on production data!

Got "You have written for the day" banner working

Got the "You have written for the day" banner working. Now you'll see it on home page immediately upon login whether you had written for the day. ~ @brianball's idea.

⚠️ Please write before midnight to keep your streak!
✅ Awesome! You have written for the day.

Got an unexpected 'windfall' to make this quickly. Didn't realise the date-streaks package comes with a Boolean data item that calculates if user had written for the day or not. That made it relatively easy to implement! One of those lucky days! A nice break from having to struggle and fight uphill battles with code everyday 😅

Set up transfers for accordion dropdown menu Carrd template to 7 users

I really got to get this started! Upload a paid template asap to build on this momentum!

Organic sharing/marketing on Twitter

Role model for brand account synergy with personal account on Twitter - how @harrydry does it with @GoodMarketingHQ

Day 71 - More sleep biohacks https://golifelog.com/posts/more-sleep-biohacks-1615536107529

Some new sleep biohacks that I’m looking forward to experimenting with:

Antioxidant supplements
Better daylight alarm
Resuming night meditation

Deployed 2 features to Lifelog - edit/delete comments + child notifs, mark notif as read

✅ Lifelog feature updates

🗑 Edit/delete of comments is HERE! If you update your comment, the 'child' notifications that were sent previously with that specific comment get updated as well.

✉️ Mark notification as read using the envelope icon on bottom-right of each notification box. No more clicking through just to mark it as read. A temporary bandaid while I build the harder one in future - auto sorting/grouping of notifs by unique post, and marking-as-read by batch.

📝 Next up: edit/delete of posts...

Day 70 - Random review of $5k MRR goal https://golifelog.com/posts/random-review-of-dollar5k-mrr-goal-1615444540902

It’s not a special day or a milestone for anything, but I just felt like doing a quick review of my $5k MRR goal:

"I’ll learn my way towards $5k MRR by end 2021. In return, I’ll have fun growing my indie products, and adhere to a healthy, happy habit system. And I’ll surrender."

😎 YAAAS!!! Solved the edit/delete issue of previous generation notifs on a different content model

Comments are easy to edit/delete, it's the edit/delete of its related child notifications that are hard. Adding a new content field to the notif model only added new complexities, where previous and current generation of notifs need to be handled differently (key thing is, fetching the right notif for previous gen and current gen uses different filter params due to the additional commentContent field).

Should I care if previous generation notifications get updated if a user updates the parent comment? It's likely not a common use case (people don't usually go back to old comments to edit/delete them), but I like things to be backwards-compatible instead of sweeping this tech debt under the carpet. Took more time for sure, and double the complexity, but I hope it's worthwhile for better UX.

Had to add if else statements to both the delete and edit functions, to accommodate both generations. The condition `this.relatedNotifs.length` is based on fetching the current gen of notifs - if .length=0, then run function for prev gen; if .length>0 then run function for current gen.

Created and refactored for a new content field in notifications content type, to hold just the comment text for easier updates of the notifs

Dumped regex (yet again), went with creating a new field for commentText in my notifications, and went on to refactor the notifs POST requests going out. A delicate operation, lots of moving parts, had to be done on high alert (coffee!). Managed to do so, but uncovered an unexpected difficulty - edit/delete of older comments (where this new content field = NULL) won't work, or will be problematic to implement.

Should I care? I doubt being able to edit/delete old comments will be a common use case... should this be a tech debt to sweep under the carpet? 😅

Day 69 - Cohort-based courses https://golifelog.com/posts/cohort-based-courses-1615360102165

An interesting trend emerging on Twitter – cohort-based courses. Everyone seems to be launching a course these days, and what’s special this time round is how the course creators organise each course by cohort, instead of an evergreen, join-anytime course on a platform like say Udemy.... Pros and cons I observe so far:

Organic sharing/marketing on Twitter

Losing steam. Not sure if I'm doing it wrong, or it just takes time. Not seeing much effect from organic engagement and just chatting...
Adam Marsden

I would do more with your personal account too. People like to be able to put a face to the product, especially helps with building in public. I pretty much only use my personal Twitter and make sure to make the content useful for people while being able to talk about my own projects.

0 Likes
Jason Leow Author

@AdamMarsdenUK thanks for the tip! Yeah, i was a bit torn tbh. I do loads of varied stuff, so my personal account can look pretty scattered. Thought I might try using a brand acc to engage instead, with a focus on niche content for writing habits. But not sure if it comes across as authentic…

0 Likes

Day 68 - Eliminate choices to be more productive https://golifelog.com/posts/eliminate-choices-to-be-more-productive-1615267100599

"Choice is overrated. If you value your productivity, performance and success, eliminate choice as much as meaningfully possible."

Experimented with various ways to update the notif body text on comment update

As usual, something I thought was simple became quite difficult. And Pareto's a bitch - the last 20% takes 80% of the time, for sure!

I can update notifs upon updating a comment in 3 ways:

* regex - elegant but might not capture edge cases, and without testing, lots of uncertainty
* plain Javascript functions like split(), splice(), join(), push() - convoluted chaining of functions together, but readable
* create a new content field in notifications content type, to hold just the comment text - simplest, but have to refactor widely.

Day 67 - Tune your car to used tires https://golifelog.com/posts/tune-your-car-to-used-tires-1615197302032

"Many teams…try to set up the car setup in response to how the car is performing in ideal conditions. But race cars perform differently at different times in the race. At the beginning, tires are new and fresh. At the end, they are worn and overheated. To maximize the car setup, the setup should be done on excessively worn tires. This way, the car is being set up to perform its best when the race is at its worst… the alignment settings will start to work better and the car will come alive later in the race." - @pkonsta23 on Twitter

😎 Got delete notifs together with deleting comment working

On delete of each comment, I got to also delete the different types of notifications that had went out together with the comment! Had to fetch and massage some data before using axios to delete:

- to delete notifs I need the IDs of each associated notif. The IDs of the notifs are not readily available as there's no relation between a notif and a comment (I know, maybe I should add that relation). So had to first GET request to my notifs endpoint, with filter params to search for the right notifs to delete. Filters includes containss (case sensitive) comment content, post slug, comment author being same as logged in user.
- once I got the output as an array of to-be-deleted notifs, use map() to create another simple array of just the notifs IDs, e.g. [ 501, 504 ]
- then map() to run the $axios.delete function to each notif ID using a for loop `for (let i = 0; i < this.notifsIds.length; i++)`, and finish with Promise.all()

Fixed streak for @brianball

Editing my backend database tables directly always stresses the hell out of me! So irrational, yet raw. Anyone else feels that way? How did you overcome it?

Added a temp measure for setting notifications to read without going to post page

Did some quick work on this. Hardest part was adding a button within an anchor link div (not best practice apparently) - the "Set to read" button is nested within the container notification box that's an anchor link to go to the post.

At least this is a bandaid patch to reduce friction of having to click through to each post page, even though a bunch are from the same post page. The ideal feature would be automatic sorting and grouping of notifications by unique posts - which will take longer to build! 😅

✌️ Finished inline editing for comments, got delete working

Decided to go with a Submit / Cancel buttons, instead of Submit + Close button, because the CSS for the close button took too long! ROI of that over a Cancel btn is not worthwhile enough.

Got Delete button working too, with a standard browser confirm() modal to confirm deletion. Though I was done with delete but no, because I got to also delete the 3 types of notifications that had went out together with the comment! 😰 OK that's gonna be tricky...

Just started using Tweetdeck to manage all the different accounts I have - what have I been missing?!

Day 66 - 1 year 'streak' as an indie hacker parent https://golifelog.com/posts/1-year-streak-as-an-indie-hacker-parent-1615102541411

Just yesterday we celebrated my son’s first birthday. With that, my wife and I had been parents for a full year now. A one year ‘streak’, in the familiar lingo here. Not that I was tracking, and I can’t break the streak even if I wanted to, LOL.

This is not a post about my son – I’m usually reserved about talking about my family. What I would love to talk about is how the whole experience had shaped me in other areas of life, especially my work as an indie hacker:

⏳ The power of constraints
🏥 Trailblazing a deviant path far away from the mainstream