Jason Leow

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

Sent $120 payment request to Carbs For Keto for banner ad

As part of Fund Feb goals:

1. At least 1 task per day to monetize something.
✅Banner ad for Keto List

2. Setting aside at least 1h everyday to work on money.
✅ Talked to people on Twitter about daily writing, habit formation and goals. Shared #lifelog 8 times

Organic marketing aka just chatting with people on Twitter about daily writing, habits & goals

As part of Fund Feb goals:
1. At least 1 task per day to monetize something.

2. Setting aside at least 1h everyday to work on money.
✅ Talked to people on Twitter about daily writing, habit formation and goals (aka 'marketing'). Shared #lifelog 8 times
[UPDATE:] Oh wow someone replied saying they would give it a try! Did I just acquire a customer directly via organic engagement??!! 😱 It never works like that!

Day 34 - Planting money on the first day of spring https://golifelog.com/posts/planting-money-on-the-first-day-of-spring-1612337395028

"...the first part of getting money is actually wanting it, isn’t it? For my whole life I have had a strained relationship with money, thinking that it’s dirty, and only dealing with it out of necessity but in distaste. So I can see how this little ceremony can help with my money mindsets and beliefs.

Every drop counts, when you’re trying to drill through stubborn rock with just dripping water."

Day 33 - When even 1 push-up feels good https://golifelog.com/posts/when-even-1-push-up-feels-good-1612245343278

"I will learn my way towards $5k MRR by 1 Jan 2022. In return, I will learn how to grow my indie products diligently, and adhere to a millionaire habit system."

Shared about my services in Productized Services Facebook group

Fund Feb goals:
✅DONE - At least 1 task per day to monetize something. Done 2 so far.
Setting aside at least 1h everyday to work on money.

Sent email to Keto Divas regarding advertising on

Fund Feb goals:
✅DONE - At least 1 task per day to monetize something
Setting aside at least 1h everyday to work on money.

🚀 Just pushed HUGE Lifelog updates! Badges, goals, leaderboards, profile + account pages

The group had talked about the dominance of the daily streak and how we can celebrate other aspects of writing at Lifelog, especially adding more weight to the goals aspect. So this series of updates is a small step towards addressing that!

🎖 We got badges! For streaks, goals, posts, comments. Check out your profile page to see what you got so far. Need more ideas on badges too. Kudos to @brianball for this!

🎯 Your goals are now listed on your profile page. There's even a nice metric showing you how many posts you wrote for each goal (as suggested by @Lobacrow). Soon to come, a public page for each goal that shows a list of the posts you wrote for that specific goal.

🔥 Top 3 streaks and new members at the side bar on home page. @brianball nudged me into this haha.

👩🏻‍🎤 Public profile page that everyone can view

🔒 A private account page that only a logged in user can view.

Created timezoneselect component for account page, and added timezone endpoint to display tz

Optimized profile page by changing endpoints and respective payload, killed bug

Changed/created endpoints for profile page:
- to fetch just a total posts count instead of all posts (twice), one to get the total number and the other to get a list
- created a new endpoint just to get username and user id instead of the users endpoint which fetches too much unnecessary data,
- debugged streak undefined bug (happens when user has no posts) using v-if="streak == undefined" to show empty string, and v-else to show badges when user has written at least on epost.

Minor style tweak to notifs counter in Navbar and notifications - tried 🍋 yellow/light-yellow for notifs - doesn't work!

Day 32 - Fund Feb https://golifelog.com/posts/fund-feb-1612173864861

"...For too long, my relationship with money had been tenuous and strained. So mindset-wise, I would love to start working with and for money in a different way. A more grown-up, sensible way, perhaps. Not as an after-thought, or a necessary evil. Money is just a resource, a collectively agreed representation of value in the form of paper. It’s ethically and morally neutral in and of itself. It’s the attitudes and beliefs we bring to it, about how it’s earned and spent, that taints it with human morality. So while I work on getting money, I would like to see if I can also change my mindsets around money. I’d come here before, asked the same questions, wished the same outcomes. Looks like this is a long game."

Day 31 - Jumpstart January wrap-up https://golifelog.com/posts/jumpstart-january-wrap-up-1612102417919

"...it’s nice to be “firing on all cylinders” in the first month of the new year. Not of course without some potholes like getting dengue, and an epic bug related to the streak in Lifelog. But all signs of better things to come (right now I’m just telling myself that, to hype myself up).

Onwards to February!"

Managed to access the user object without needing auth, thanks to @keenencharles! 🍻

Making profile pages public without being locked in to auth, in progress

const users = await this.$http.$get(`/endpoint`)
const user = users.filter(
(user) => user.username === this.$route.params.profile
)
this.profileUser = user[0]

Started 5 transfers for my accordion dropdown menu Carrd template. They really love it!

Day 30 - Social impact patronage, part 2 https://golifelog.com/posts/social-impact-patronage-part-2-1611993860362

"...Perhaps I don’t have to be the one with all the good ideas for social impact projects. They can come to me instead. I can call for project ideas from non-profits and charities, and have a mechanism to filter and select the ones that I can reasonably accomplish. And it’s always better to be working with experts out in the field, who are close to the beneficiaries and the social issues at hand.

So I guess I have to launch this now… no more excuses!"

And, joining #teamstreak today on Lifelog!

Added more metrics to profile page - badges, goals set, and goals list

Been wanting to reduce the dominance of the daily streak, so added a bunch of other metrics like number of goals set, a list of all goals, number of posts written, and badges! Pretty proud of them badges. 😍

Fixed bug where notifs count doesn't show up on home page upon login

Had to emit the fetchNotifsCount() method at the end of the login() method on login page

this.$root.$emit('fetchNotifsCount')

Day 29 - The elusiveness of gratitude & abundance https://golifelog.com/posts/the-elusiveness-of-gratitude-and-abundance-1611902191165

"Gratitude is the exquisite, nourishing sense of having enough. Abundance is experiencing what this means: that there’s nothing here, there’s no odds of something favourable coming, but there’s still enough for you for something to happen."

Added line break to notif text body using regex instead of having to create another db column/field (too lazy!)

Regex solutions are pretty elegant and concise, but darn hard to read (for me)! This regex adds a line break after the first colon :

... notif.body.replace(/(\:\s+)/, '\$1

')

Added lazy loading to notifications

Encountered minor bug/issue where everytime I clicked on one notif, the API endpoint fetches +10 more notifs to the notifs page, because of the $route watcher set to the `fetchNotifs` method plus the limit parameter suffixed to the endpoint (the watcher is there to update the class of the notif):

data() {
return {
notifs: ' ',
page: 20,
}
},
...
watch: {
$route() {
this.fetchNotifs()
},
},
...
/notifications? ... &_limit=${(this.page += 10)}

Had to create a new method `updateNotifClass` for the watcher, with no limit params suffixed to the endpoint, just calling `this.page`. For reasons I don't yet understand, `this.page` just pings endpoint using the last set page limit, thus updating only the notif class without adding more notifs.

watch: {
$route() {
this.updateNotifClass()
},
},
...
/notifications? ... &_limit=${(this.page)}

😓😓😓 Experienced my first race condition with a baaadly written function...ended up with 60+ new posts within seconds. Thankfully only on local dev machine, phew

Function been deleted but I think this was the offending code. Big learning point

methods: {
async postCommentAndNotif() {
await this.postComment()
this.postCommentAndNotif()
},
}

Removed 240 char limit in notifications/models/notifications.settings to prevent 500 error

Updated timezone offset to -5h (UTC-5) in date-streaks helpers.js via patch package

Updated patch-package kept having errors at build time - had to reinstall package, then delete cache, build, node_modules folders in my Strapi app, clear build cache in Heroku, added npm_config_production=false to Heroku config vars.

I think deleting the node_modules was the key.

Added truncate and removeLineBreaks functions to notifs text body, removed regex from username part of notif and used split() instead.

The regex did break the notif text body. Text was rendering weirdly in the username part of the notif. Changed to using a split() function.

{{ notif.body.split(' ')[0] }}

Ref: https://stackoverflow.com/a/19503397

Day 28 - Barbell out of stasis https://golifelog.com/posts/barbell-out-of-stasis-1611818159735

"How would a successful bimodal “barbell” approach look like in my work and life?"

Extract from the book Antifragile:
A dual strategy, a combination of two extremes, one safe and one speculative, deemed more robust than a “monomodal” strategy; often a necessary condition for antifragility. For instance, in biological systems, the equivalent of marrying an accountant (stable life) and having an occasional fling with a rock star (good fun); for a writer, getting a stable sinecure and writing without the pressures of the market during spare time. Even trial and error are a form of barbell.