🚧🚧 New SaaS Project 🚧🚧

I started building my own little saas project this morning. My aim is to build it a little each day and to see how far I can take it.

If that sounds like something you're interested in then follow along.

A thread 👇🏼👇🏼👇🏼
This is a reboot of my previous attempt at something similar back in May (although that was a different concept). Life got in the way, as it often does for us all, but I'm dusting myself off and getting back on the horse! 🐴 https://twitter.com/iamdavidhill/status/1256369378255306753?s=20
Inspired to start again by @mubashariqbal's recent @onehoursaas project. Thanks for the inspiration and kick up the backside Mubs! 🙌🏼 https://twitter.com/mubashariqbal/status/1297158604554895360?s=20
🗓️ Day 1: Getting Started

⚡️ Repo setup
⚡️ Laravel
⚡️ Jetstream
⚡️ Unix Socket and Storage:Link quirks

It doesn't look like much, but I have auth, profiles and teams setup.

I'm still using MAMP as a local env, I've heard there are better alternatives. Any suggestions?
🗓 Day 2: Stripe Integration (Part 1)

⚡ Cashier
⚡ Stripe account
⚡ Stripe products
⚡ Stripe Customer Portal (CP)
⛔ Redirect to CP

I have a "redirect" working via a POST Request and a Controller... set to redirect to Index because I can't figure out the redirect to CP.
I'm using @stripe's Customer Portal for subscription management so that I can focus on the main app.

Stripe's docs are amazing, although they assume I have more experience than I do.

I understand the principles, I just need to keep watching @jeffrey_way to learn how to do it.
🗓 Day 3: Stripe Integration (Part 2)

⚡ Stripe PHP package
⚡ Tutorials and research
⚡ Reached out to mentors for help
⚡ Zoom with @dave_stewart
⚡ Added MySQL table for links
⛔ Still working on stripe integration

Small steps forward today, but steps nonetheless.
🗓 Day 4: Stripe Integration (Part 3)

⚡ Stripe CLI
⚡ Stripe Checkout integrated
⚡ More tutorials
⛔ Stripe Customer Portal

I was integrating Portal before implementing Checkout, so I couldn't pass the Customer ID to the Portal. Checkout as simple as a snippet. Portal next...
🗓 Day 5: Stripe Integration (Part 4)

⚡ Bought @phpstorm
⚡ Created @tuple account
⚡ Had first pairing session with Mentor
⚡ Refactored my code
⚡ Stripe Customer Portal working
🐛 Bug with the Stripe customer data

Really pleased with today's progress, I learned a lot.
I decided to hire a mentor who can help to up my developer game. My goal is to go from "Designer who hacks at things"** to "Developer who knows his shit".

Tutorials and courses are great, and I'll always use them, but I need faster feedback loops.

**Thank you @StackOverflow
🗓 Day 6: Stripe Integration (Part 5)

⚡ Setup @phpstorm
⚡ Learned new IDE features
⚡ Installed a @wesbos theme
🐛 Debugging

Checkout and Customer Portal connected. Just need to save subscriptions so that I can pass the customer_id to the Portal redirect.
🗓 Day 7: Stripe Integration Complete

✅ Stripe integration complete
✅ Mentoring Lesson

One week since starting this little challenge, and I have an improved dev env, a mentor, and the basics of an app, inc. registration, subscription, and managing subscriptions.
🗓 Day 8: Created Model

✅ Link Model
✅ Link Controller
✅ Link View
✅ Link Table
✅ Setup @TablePlus

Created the working model for my links. I'm becoming more comfortable with Laravel. Still a ways to go though.
🗓 Day 9: Database Connected

✅ Connected database
✅ Dynamic views

Connected up the database, creating dynamic views based on content within the table, and routing to domain.test/{slug}. Incremental steps.
🗓 Day 10: Learning

✅ Mentor lesson

Solidifying more of the basics and my understanding of Laravel with another coding session paired on @tuple. Tuple is such an amazing experience and having a mentor is proving to be a very worthwhile decision.
🗓 Day 11: Refactor and Test-Driven

✅ Refactoring and clean up
✅ Test-driven development

Started learning about TDD in my mentoring lessons. Setting up feature and unit tests. Really interesting concepts that I'm eager to build on.
🗓 Day 12: Test Test Test

✅ Core user flows mapped
✅ Digging deeper into TDD

Moving slow now by taking the time to learn these processes, in order to move fast later.

Who's wrote good documentation on testing in Laravel?
🗓 Day 13: User Stories

✅ Writing user stories
✅ Reading documentation

Captured a full list of user stories in Notion. I'll use it as a simple checklist to make sure I build everything that I need to. Watching more Laravel tutorials.
🗓 Day 14: Tinkerwell

✅ Exploring @Tinkerwellapp
✅ Reading documentation

Digging into Tinkerwell. I need to get better at using this for tinkering with my database. Does anyone have any great resources for learning?

cc @marcelpociot
🗓 Day 15: Tinkering

✅ Using @Tinkerwellapp
✅ Cleaned up Notion

It wasn't the most productive day, but I tried to push forward with some things. @magicroundabout's YouTube video really helped me to wrap my head around Tinkerwell a little better -
🗓 Day 16: Extensions

✅ Chrome extension research

I was unable to get much real work done today. I did manage to dig a little into Chrome Extensions though. They seem relatively straight forward. I think an extension may play an important role in my SaaS. Bookmarked for later.
🗓 Day 17: More Tests

✅ Writing more tests

So this Test Driven Development approach really does involve a lot of writing tests 😅

I’m still getting my head around the process. But between my mentor and @CodersTape’s help, I think I’m getting there.
🗓 Day 18: Still Testing

✅ Super test-driven
✅ Sketches

I fear these daily updates are going to be a little samey this week. I'm still learning test-driven development. More tests, more assertions. These are in my test project right now. Need to migrate to my SaaS project.
🗓 Day 19: Usernames

✅ Adding usernames
✅ Learning DB migrations
✅ Learning Factories
✅ Learning Seeders

Another day down, with more learnings in the bag. We keep going.
🗓 Day 20: More Learning

✅ Social login
✅ Learning Observers
✅ Learning Events
✅ Learning Listeners

Today was a huge step in understanding more fundamentals of Laravel. Can’t wait to put this into practice for real in my app.
🗓 Day 21: Relationships

✅ Learning relationships

The last two weeks have been spent learning the fundamentals of Laravel so that my approach going forward is less, “copy, paste, and hope” and more thoughtful and intentional.

On Monday we start building for reals.
🗓 Day 22: Schema

✅ Planned DB schema

Planned a first pass at my database schema. Looking at the relationships between tables based on what I learned the day before.
🗓 Day 23: Schema

✅ Develop schema more

Had to wrap up my company accounts today so it wasn’t the most productive of days for my side project. Although I did develop the schema a little more and registered the social handles.
🗓 Day 24: Migrations

✅ Setup Models
✅ Setup Migrations

Setup the first pass at the models and table migrations. I learned about passing JSON to the table today which is super cool. I would love to spend all week on this, but I only have an hour or two a day to chip away.
🗓 Day 25: Factories

✅ Setup Factories
✅ Fixed Migrations

Definitely starting to feel more comfortable with Laravel and with the concepts of TDD. A long way to go. But 25 consecutive days of learning, even if it’s only for 30 mins is making a huge difference.
🗓 Day 26: Post Types

✅ Created post types
✅ Tests for each type

Learning how the backend works is so empowering. Watching an application come together without even touching the front end is such a new concept for me, it’s so cool though.
🗓 Day 27: Validation

✅ Added validation

Learned more about validation. Learned the “exists” rule which allows you to reference that a value appears in the column of another table. So cool.
🗓 Day 28: Day to Forget

🚫 Multidimensional Array

Spent all of my allocated time struggling with validating data from a Multidimensional Array. Shouldn't be that difficult, but I made a right mess of it.

On the plus side...

Today marks 4 weeks of consistent daily commits.
🗓 Day 29: Delete Posts

✅ Added delete posts

I didn't have a lot of time to work on this today. So I switched gears from yesterday and implemented delete posts along with tests for it. Another little step forward, and one less step to take tomorrow.
🗓 Day 30: Planning

✅ Plan for the week

A busy day spent house remodeling so little time to jump into code today. Made a solid plan for the project for the week ahead though.
🗓 Day 31: Pinning Posts

✅ Pinning Posts
✅ Learned new tricks

Learned about Refresh in Laravel today so that I can just pass my updated info to the database without needing to update it all. Super neat.
🗓 Day 32: Refactor

✅ Refactored pinning

Refactored pinning and unpinning posts. Added additional tests. Not a huge day for feature work, but another small step.
🗓 Day 33: Research

✅ Researching docs

Not a productive day for the project (was anyone productive today?) Read some documentation that will be useful for the product though.
🗓 Day 34: Like Posts

✅ Added Likes

Added likes feature and more tests. Really loving Laravel. Already excited to start more projects with it. So much fun.
🗓 Day 35: Debugging

✅ Debugged post likes

A busy work week meant progress slowed down towards the end of the week. But tomorrow I’ve got a good chunk of time dedicated just to this in the morning, looking forward to it.
🗓 Day 36: Comments

✅ Update comments
✅ Read comments
✅ Delete comments
🇺🇸 Hope

Update from yesterday - I got distracted with everything going on and forgot to update. It was such a great day yesterday!
🗓 Day 37: Managing Comments

🚫 Owners managing comments

I made progress today on some challenging (at least for me) features. I feel like I wrote some of my best backend code yet. Although I couldn't quite get it all to work. I know what needs fixing so feeling pretty good.
🗓 Day 38: Tutorials

✅ Watched tutorials

Blocked by some permissions validation I watched some tutorials to unblock myself. It didn’t work 😂 But I did learn some other new tricks. We continue to validate comment owners today...
🗓 Day 39: More Tutorials

✅ More @laracasts

Another spent learning. Moving slow now to move fast later.
🗓 Day 40: Still Blocked

🚫 Deleting comments

Yesterday's update: Still blocked authenticating that users AND post owners can delete comments on a post. I have my test written and it's behaving as expected, just need my controller to play nice now. Any suggestions?
🗓 Day 41: Research

✅ List of users

I was still blocked on comments, so last night I made a list of potential users based on Twitter searches for competitor mentions. I’m going to draft some messages tonight and start reaching out to get feedback on what I have so far.
🗓 Day 42: Research

✅ Draft messages
✅ Create Notion table

Yesterday was a busy Friday, so I couldn't do lots. Before bed, I drafted messages to send to potentials users today. I also set up my potential users in a Notion table so that I can track feedback better.
🗓 Day 43: More Research

✅ Contacted real people

I contacted people that I believe have used competitors and may have useful insights for me. Let's see if any reply, and if so, what they say.
🗓 Day 44: Pin Collections

✅ Pin Collections
✅ Unpin Collections

My app has the concept of "Posts", and Posts can be grouped into Collections. You can pin and unpin a Post or a Collection to your profile. I just added pin and unpin Collections tonight in under an hour 🎉
🗓 Day 45: Planning

✅ Planning

It’s been one heck of a busy day, it’s too late to start anything meaningful now, so I’m just planning work for tomorrow, and writing some rough Sudo code so that I can hit the ground running.
🗓 Day 46: Like Posts

🚧 Built (kind of)

I just made a Like Posts feature... although... I'm not sure that I made it in the best way possible... and it has no validation for the amount of time a user can Like a Post. Time to put my mac down for the day and revisit tomorrow.
🗓 Day 47: Tailwind CSS

✅ Research

Not a lot of time for dev work today. But I did watch an @adamwathan talk about how he uses @tailwindcss. Convinced me to give it a try.
🗓 Day 48: PR's

✅ Merged delete comment
✅ Merged like/unlike posts

Merged issues that have been blocking me for days. Onto the next feature... Following.

It's been 48 days of continuously chipping away at this. Somedays only 30 mins, some days 2 hours.

Bit by bit.
🗓 Day 49: Following

🚫 Blocked Following

Tried adding a following model at lunch, where users can follow other users, Twitter-style. I got stuck and my tests keep spitting out an error. Tried to debug, but giving up for the day. Here's what I got, does this look ok?
🗓 Day 50: Design

✅ High level flows
✅ Initial designs

I attempted to learn notifications in Laravel, got too distracted, and so decided to design instead. I drafted user flows for different features, and also started to venture into visual a little. Felt good.
🗓 Day 51: Design System

✅ Design System

Spent some time putting together the beginnings of a design system. Still a ways to go, but I’ll share screenshots this week.

Also watched more @adamwathan videos on @tailwindcss. Looking forward to trying it out on this project.
🗓 Day 52: Following

✅ Following

Completed the Following feature today with some help. This is definitely one of those features I could launch without, but one of those that I wanted to learn and add to my bag of tricks 🪄
🗓 Day 53: View Follows

✅ View list of followers
✅ View list of following

Added views at lunch today to show a user's follower and following list. Need to refactor my naming conventions because follow, followed, following, followers... all got super confusing in my code 👀
🗓 Day 54: Update Relationships

✅ Posts belongsToMany Collections
✅ Added Collection Observer

Refactored that Posts can belong to many Collections. Makes more sense that you can create a "post" once and then re-use it and add it to numerous Collections.
🗓 Day 55: View Posts

⚠️ User can view pinned posts

In my app, a user can create "posts" and can pin those posts to their profile. Only the pinned posts are viewable by other users. I've just made the test, controller, route, and view. Test says it's working, I'm not so sure...
🗓 Day 56: View Pinned Posts

✅ User can view pinned posts

Got this working with some help this morning. I was so close to getting it to work too. Definitely improving, but there's still lots to learn.
🗓 Day 57: View Liked Content

✅ View Posts you've liked
✅ View Collections you've liked

Worked on getting the backend tests and structure in place for these two features. I have a few more tests to write tomorrow. This gives me a great starting point.
🗓 Day 58: Learning

✅ Tutorials
✅ Bought Laravel Nova

I reviewed last night's code and made improvements. Any free time I've had today has been spent watching tutorials and learning. I bought @brunocfalcao's, Mastering Nova. Looking forward to digging into it and using Nova.
🗓 Day 59: Notifications

⚠️ Add notifications

I'm still wrapping my head around this feature, and still in the process of implementing it. Not many backend features left on my list now. Explored quite a few new concepts with this project. Can't wait to jump into front-end!
🗓 Day 60: Collection Likes

✅ Collection Likes
⚠️ Collection Like Notification

You can group Posts into Collections, and users can like Posts, so I added the ability to like Collections too.

I also noticed that I hit 100 commits on my project today.

Slow but steady 🐢
🗓 Day 61: More Notifications

✅ Collection Like Notification
✅ New follower Notification

Added more notifications today. Started trying to implement notifications for when someone you follow posts a new post... but haven't managed to get it working so far.
🗓 Day 62: New Post Notification

🚧 Still working on it

Trying to add a feature that notifies users that someone they follow just posted a new post. I have the event, listener, and notification setup, just need to understand why it’s not working now 😂
🗓 Day 63: New Post Notification

✅ Working

Got yesterday’s feature working. User’s will receive a notification when someone they follow posts a new post. Learned more about eloquent relationships. One more task down.

Thanks for sticking with these extremely vague updates 😂
🗓 Day 64: Learning

🎓 More tutorials

It was a family day today, so no chance for feature development. I did sneak a couple of @DailyLaravel tutorials in whilst I was on baby duty this morning though 😅
🗓 Day 65: Learning

🎓 Notification tutorial
🎓 Custom domain research

Another great family day, so only one disrupted hour or so researching and learning new concepts. It seems that adding the ability for customers to use custom domains with my app, isn’t actually that hard 🧐
🗓 Day 66: Finished Notifications

✅ New comment notifications
✅ Install Laravel Telescope
✅ Install Laravel Jetstream

I've wrapped up backend work on notifications for now. Installed Telescope and Jetstream. Moving closer towards front-end work.
🗓 Day 67: Custom Domain

🚧 Started work on allowing users to use a custom domain.

Need to decide how the custom domain feature works with Jetstream / Users/ Teams

Did you know you can link multiple domains to one local env for testing. This will be super handy.
🗓 Day 68: Custom Domain

🚧 Continued Development

I continued to work on this task during my lunch. Lots of new little challenges regarding verification to solve. Started with tests as usual. Lots more tests and development to go.
🗓 Day 69: Stripe Integration

✅ Verify domains must be unique
✅ Stripe Cashier
✅ Stripe Customer Portal

More custom domain work. Loving learning @laravel, and Jetstream. It would be cool if it had the option for a Stripe subscription built into the registration flow.
🗓 Day 70: Stripe Integration

✅ Subscription middleware
✅ Register then subscribe

Learned about Middlewares today and created one to check if the user has an active subscription or not. Learning basic stuff like this is going to open all kinds of possibilities for me.
🗓 Day 71: Research

✅ Pricing research

A busy family day today, but managed to carve out an hour this morning to research pricing and give some thought as to the number of plans I’ll offer and how that relates to certain features. Then looked back and questioned it all 🤔
🗓 Day 72: Update Like Count

🚧 Update Post Like Count

Attempted a little late-night tinkering. I have the test, controller, event, listener and service provider all set up. I just need to get the listener to update the count in the database. There's always tomorrow.
🗓 Day 73: Update Like Count

✅ Update Post Like Count

Small win. Fixed last night’s attempt at updating the Post Like Count in the database. It was a simple mistake to fix, that was very obvious with fresh eyes.
🗓 Day 74: Subscriptions

✅ Subscriptions
✅ Subscription middleware
✅ Stripe Customer Portal

Have the beginnings of a front-end. With registration that flows into select a plan and billing. Middleware that detects plans too.

Would anyone want a detailed blog post on this?
🗓 Day 75: Rules

✅ Subscription Rules

Started defining the rules for subscriptions in one clear multidimensional array. I can check to see if the user is subscribedToPlan AND rule is met. Just need to plug all my rules in now.

Hoping to start UI over the holidays.
🗓 Day 76: Domain Verification

✅ Domain verification

Refactoring the custom domain feature to be a redirect custom domain. Made it so that domains can be verified via a TXT token in the DNS records. Had lots of help with this one.
🗓 Day 77: Refactoring

✅ Housekeeping

Just a little refactoring and cleaning up this evening. Wrapped up client work for 2020 today. Hoping to make more progress on this little project over the holidays. But also extremely mindful to relax too.
🗓 Day 78: Name Edits

✅ First and Last Names

I updated the registration and associated validation and views to use first_name and last_name, and to automatically create a name by merging the two.
🗓 Day 79: Post Refactor

😴 Fell asleep

Had a chilled family day, tried to sneak some work in at 11pm after watching The Christmas Chronicles (great Christmas movie), tried to finish some refactor work... fell asleep 🤭

Going to sneak work in before the day starts tomorrow.
🗓 Day 80: Add New Post

🚧 Front end

Started work on the front end last night. Basic model saving to the database. Going to style it out over the next couple of days.
🗓 Day 81: Design

🚧 Post Design

Made some real progress on designing posts and the post editor yesterday. It brought up questions around the relationships of accounts, profiles, and teams that I'd been putting off though. Need to figure that out before I can continue.
🗓 Day 82: Has Many Profiles

💥 User Profiles

Based on today's pivot I attempted to decouple user profile from user account, so that an account hasMany profiles. I updated, and made my models, migrations, and factories... but then boom! It all broke 😅 https://twitter.com/iamdavidhill/status/1341821390962515974?s=20
🗓 Day 83: User Profiles

✅ Users have many profiles
✅ One profile is current
✅ Posts belong to profiles

I was so close to getting this to work yesterday. I’m understanding lots more which feels good. Made a couple of small mistakes which I got some help to fix today.
🗓 Day 84: Christmas

✅ Christmas breakfast
✅ Exchange presents
✅ Woodland walk
✅ Nigerian lunch
✅ Christmas Dinner
✅ Drinks and a movie

Not a single second was spent on my project today. It’s all about family.

Merry Christmas Everyone! 🎉
🗓 Day 85: Refactoring

✅ Refactoring profiles

Yesterday I started refactoring all of my work so far so that everything belongs to the current profile of the auth user, not just the auth user.

Tests have really helped this process, they’ve given me complete visibility.
🗓 Day 86: Refactoring

✅ Refactoring profiles

This has been a real refactoring effort. Changing something as fundamental as accounts and profiles has set me back. Hopefully, it will make for a better user experience.

Working my way through tests to get everything working.
🗓 Day 87: Advanced Posts

✅ Extra fields
✅ Extra settings

Yesterday I was getting to grips with backend form validation based on dynamic form inputs, then traversing that data in JSON.

It feels powerful to know how to ask for data, validate it, store it, and then show it.
🗓 Day 88: Templates

✅ Advanced Post
✅ Create Templates

After a fantastic family walk this afternoon, I worked on the post editor. I added design and preview settings. I think a user may want to save a post as a template to re-use it, so I started work on templates.
🗓 Day 89: Designs

✅ Design System

Yesterday I spent a couple of hours revising the design language for the post editor. I had a wireframe to code from, and have basic HTML forms. But before jumping into Tailwind I wanted to have a clear solution for each of the elements.
🗓 Day 90: More Designs

✅ Design iterations

After the family went to bed last night I spent an hour riffing on designs.

Feels like I should have a finished product after 90 "days", but I have to remind myself that they're far from full days. Working on it again tonight.
🗓 Day 91: Post Editor

✅ Post editor complete

I completed the designs for the post editor last night. There were more intricacies than I anticipated, with much more exploration than I probably should have given it.

Tonight, I'm working on the dashboard designs.
🗓 Day 92: Dashboard

🚧 Dashboard

Started working on rough Dashboard designs last night, and began questioning the number of features I had built in the backend. May decide to release with fewer features and release them over time.
🗓 Day 93: Create Collection

✅ Select or create collection

I figured out and implemented how to select or create a collection for a post whilst creating the post itself. The CreatePostController can create multiple different model instances based on the posts settings.
🗓 Day 94: Organised

✅ Updating TODO‘s

I didn’t have much time last night to work on any feature stuff. I’ve been jumping around between tasks recently and so I took some time to update my todo list and prioritise it.

It’s crazy how a simple app can lead to so many tasks 🤯
🗓 Day 95: Tailwind

✅ Read Docs
✅ Bought Tailwind UI

Last night, I re-read the Tailwind docs to prepare for beginning to implement it today. Time to take my basic HTML, and sprinkle some CSS magic on it.

I also bought Tailwind UI so that I can learn best practices.
🗓 Day 96: Tailwind and Alpine

💙 I love Tailwind CSS
💚 I love Alpine JS

I started adding @tailwindcss and @Alpine_JS to my project this evening after my family went to bed.

It's now 2am, and I need to stop! First time using both and having so much fun learning them.
🗓 Day 97: Post Editor

✅ Post editor reactive

Really getting to grips with Alpine JS and adding lots of reactive elements to the post editor. It's really starting to take shape now.
🗓 Day 98: Post Editor

✅ Post editor details

Calling it a day at 3.30am. Fine tuned a lot of the details today. Feeling good about things. Started making a mess of things at about 2am though. Definitely time for bed.
🗓 Day 99: Post Editor

✅ Post editor details

More fine tuning of the post editor this evening. This really is the core of the app so I’m sweating the details.

Day 100 tomorrow! 🤯 That’s crazy to me. Focus and consistency for the win.
🗓 Day 💯: AJAX and JSON


I have their lists of a user's templates displayed in the editor so that they can select one to save time. Tonight I tried to make it so that if a user selects a template the editor updates with data via AJAX. I failed. We go again tomorrow...
🗓 Day 101: Nightmare with NPM

🤬 Builds failing

I spent hours this evening trying to figure out why my "npm run dev" commands were failing. I figured it out by creating a new branch and copying suspects in line-by-line. Turns out I messed up Tailwind Forms and Colors config.
🗓 Day 102: Post Editor

✅ Fine-tuning

Spent the last couple of hours fine-tuning the post editor. Added the beginnings of a custom made icon-picker, and delete/ reset functions for some fields.

Used the group-hover class in Tailwind for this which worked neatly.
🗓 Day 104: Icon Picker

🚧 Still trying to make it work

After many hours of trying I can't get one little bit of my picker to work with @Alpine_JS. I need to improve my JS.

Does anyone know how to set the class of the span if the radio is checked? 🙏 https://codepen.io/iamdavidhill/pen/gOwZxGj
🗓 Day 105: Icon Picker

🚧 Close to finishing

Almost wrapped this little feature up. It’s taken longer than I thought. Learned some neat tricks though thanks to @hugo__df and @ibrahimmumcu.

Added some other little interactions to the editor, mainly conditional classes.
🗓 Day 106: Icon Picker and More

✅ Icon Picker
✅ Conditional max char limits
✅ Lots of UI updates

Spent a couple of hours working my way through my todo list before bed. Tomorrow evening I'll tackle the Style component of the editor, set colours, etc 💅
🗓 Day 107: Design Tab

🚧 Design Tab

Spent a couple of hours redesigning the design tab and implementing it this eve. I'm starting to move faster, repetition is certainly playing an important factor. I should have this tab wrapped up after another couple of hours tomorrow eve.
🗓 Day 109: Design Tab

🚧 Design Tab semi-working

Spent a couple of hours tonight making the design tab functional. So many tiny details to account for.

🇺🇸 Nice work today 'Merica! Go Joe!
🗓 Day 110: Small Factor

⚠️ Failed refactor

I promised myself that I'd try and do at least one constructive thing a day on this. Try as I might for the last 45 mins, I'm just going in circles.

Learning my lesson from last week... walking away and coming back to it tomorrow.
🗓 Day 111: Design Tab

🚧 Edit Design Details

It's 2.45am and it's time to call it a night. So many great break throughs this evening. Definitely time for a big refactor though, I've been doing everything in the same file for the sake of ease. I need to start using templates 😳
🗓 Day 112: Design Tab

🚧 95% Complete 🎉

It's 3am and the Design tab is 95% complete. Tomorrow I'll finish it and hopefully finish the settings tab too.

I know this is all still wishy washy, and 112 days is looong. But this daily commitment is real. Improving every day.
🗓 Day 113: Design Tab

🚧 96% Complete

I went around in a few circles this evening. Implemented things that I should have designed first. It works, but I can already see better ways to do it, so I jumped back into Figma.
🗓 Day 114: Design Details

✅ Visual Details

I went back to Figma last night for an hour to solve some niggling design details around "Add Image or Upload URL", as well as some other things. In a good place to wrap up those changes tonight after work and family duties.
🗓 Day 115: Design Tab

🚧 Niggling details

Designing and building great software takes time and effort. The designs I worked on last night didn’t feel right this evening. So I stayed in design mode to get them working.

Another hour clocked up.
🗓 Day 116: Font Selector

🚧 Select a custom font

I decided to allow users to choose from 8 pre-selected fonts. I'm trying to give users the ability to customise their posts, but without so much control that they look awful. I need to get feedback on this from early testers.
🗓 Day 117: Theme Switcher

✅ Switch Theme Dropdown

Made a neat little theme switcher dropdown. Being able to move from Figma to code and implement it in under an hour is such an awesome feeling. @tailwindcss and @Alpine_JS have changed the way I work. Simply amazing.
🗓 Day 118: Overlay Editor

✅ Show/hide overlay
✅ Apply theme color

Didn't have the energy to do an awful lot tonight. I added a little overlay editor. Quick 30 mins of work. Moved the needle forward a nudge. Hoping to push the whole project forward lots this weekend.
🗓 Day 119: Bug Fixes

✅ Overlay bug fixes
🚧 Footer bug fixes

I almost skipped today, but @AndrewFerguson kept me on track. I promised myself I'd do one thing every day to move this project forward, so I filed some bug fixes before bed.

Full day on this tomorrow, can't wait!
🗓 Day 120: Improvements

✅ Themes
✅ Editor panel validation
✅ Overlay color switcher

Today was a really great day for my project. Added some cool features. So many small details and responsive issues to catch. Finishing early for today... 12.30am 😂

We go again tomorrow.
🗓 Day 121: Settings

✅ Bug fix
✅ Settings tab
✅ Settings sections

Today was a long day, I had no time for my project. I've just spent 30 mins before bed putting some markup in place so that tomorrow night after work I can connect things up quicker. Another nudge forward.
🗓 Day 122: Settings

✅ Added settings content
🚧 Settings validation

Added content to each of the sections. Validation still left to do, but that will have to wait for tomorrow night. I'm finished for the day.

One less hour to do. One step closer to finishing.
🗓 Day 123: Settings

✅ Settings validation
✅ Other settings stuff

It's 2am, I'm calling it a day. I started passing Blade components through Alpine expressions tonight which was fun to try.

Still working within one file 😂 I definitely need to refactor this into templates.
🗓 Day 124: Visual Tweaks

✅ Tweaks here and there

Honestly not the most productive 45 mins tonight. I made a few edits. Went back and forth on some decisions and wasted a bunch of time. Going to think about a solution whilst I sleep 😴
🗓 Day 125: Upload / URL Switcher

🚧 Still a WIP

A user could previously upload an image or a video, but I also wanted to support adding an image or video URL, so I added that in. Needs a little touch up tomorrow, but it's working.
🗓 Day 126: Upload / URL Switcher

🚧 Still a WIP

This feature shouldn’t have taken as long as it has, but I really only managed to spend an hour on it this morning. The rest of my day was out of my hands. Will hopefully wrap it up tomorrow. Hoped for more progress this weekend.
🗓 Day 127: Fiddled

🚧 Fiddled with things

Couldn't find my groove today. Blocked on lots of little things because of NPM giving me a headache. Need to resolve that this week so that I wrap up this damned editor. By the far the trickiest thing I've ever coded. Having fun still.
🗓 Day 128: Overlays

🚧 Overlay Editor

Tried to work on some small tasks tonight. Got completely distracted by Bitcoin. Wild.
🗓 Day 129: Overlays

🚧 Overlay Editor

2am. Calling it a day. Almost finished what I was working on last night. Figured out lots of little quirks. Just one tiny detail left for tomorrow night. Happy with how this feature is turning out.
🗓 Day 130: Fixing NPM

✅ @dave_stewart helped me some NPM issues
🚧 Figuring out JS libraries

Does anyone have a better solution to this problem below? It's not working and I think there must be a better way than a nested ternary operator.
🗓 Day 131: Style Fixes

🚧 Fixing Tailwind

Recent NPM issues were related to Tailwind setup using v2, UI, and Forms. Turns out you don't need UI with v2, and so that broke some styling when I removed it. So tonight has just been fixing styles. Slowly creeping forward.
🗓 Day 132: Style Fixes

🚧 Fixing Tailwind

No major updates today. Grabbed 30 mins before bed to fix a few styling issues. That’s all I could manage today, better than nothing. The weekend brings another chance to move things along faster 🤞
🗓 Day 133: Style Fixes

🚧 Still Fixing Tailwind

No major updates today, a busy day parenting. Managed to sneak in an hour of fixing Tailwind issues at the very end of the day. The never-ending project continues to be never-ending 😂
🗓 Day 134: Style Fixes

✅ Fixing Tailwind
✅ Adding more colour options

Tonight was quite productive. Made lots of fixes and improvements to the editor. Hoping to have the editor finished by next Sunday.

That’s the goal 🎯
🗓 Day 135: Styles Fixed

✅ Settings tab style fixes

Worked on the last of the CSS fixes tonight. Back on track. Too tired for any kind of update 💤
🗓 Day 136: Icon Picker

✅ Added icons to the icon picker
✅ Booked demo

Added icons to the icon picker instead of dummy data. Not a lot this eve, but one less thing to do tomorrow night.
🗓 Day 137: SVGs

✅ Refactored icon picker
✅ SVGs for themes
✅ SVGs for position editor

@hugo__df gave me a neat tip to use x-html to insert SVG's from an array, rather than use SVGs as background images. The result is awesome and allowed me to close some tickets. Boom 🚀
🗓 Day 138: Responsiveness

🚧 Still fixing responsive issues

Spent a couple of hours fixing low hanging responsive fruit. This product definitely has the trickiest amount of responsive considerations that I’ve ever made. All fun challenges though.

Go Mars!
🗓 Day 139: Form Submission

🚧 Form submission WIP

Worked on things for about 4 hours tonight. Added a bunch of improvements using ‘nextTick’, thanks to @ryatkins for help with that. Working on the form submission experience. Calling it a day at 2am.
🗓 Day 140: Resizing Issues

✅ Refactoring

Spent about 3 hours refactoring some resizing issues. Had my wife give it a go... mixed results 🥴 Some useful feedback and low hanging fruit which I could add in and fix real quick.
🗓 Day 141: Theme Issues

✅ Theme styling

There are so many fiddly little UX and UI things to fix. Spent all evening on it. I did not think I’d still be on this editor at day 141. When I finish this and release it please say something nice, even if you don’t mean it 😅
🗓 Day 142: Collections

🚧 Select or add a collection

Didn't manage to wrap this feature up tonight as I was too distracted. Will need to wrap it up tomorrow night. There were a couple more states than I anticipated.
🗓 Day 143: Collections

✅ Select or add a collection

Wrapped up this feature and tweaked a bunch of other things tonight. I'm going to work on integrating the editor with the database again next, I lost that ability when I worked on styling the frontend.
🗓 Day 144: Meh

✅ A few error states
✅ Upgrade states

Didn't do a massive amount tonight. Added a couple of error states. Fixed a couple of bugs. Added Upgrade badges for when a user's account doesn't allow for a feature.
🗓 Day 145: Preview Controls

🚧 Still a WIP

Started adding the ability to change the preview. This is going to be a responsive nightmare, I already know it. But, I did get to a place i'm happy with tonight. So I'm knocking off early.
🗓 Day 146: Preview Controls


User can click desktop, tablet and mobile views and the view adapts. Need to work out what happens when that browser is smaller than the device you’re on. Eg. How do I view a desktop preview on mobile. Assuming it’s a viewport setting.
🗓 Day 147: Preview Controls

✅ Finished Preview Controls

Wrapped up the preview controls and tweaked some layout issues this evening. Said I’d go to bed at 12am... here I am still working at 2.30am again.

I’m getting so drunk when I finish this bloody thing 🥴
🗓 Day 148: Preview Controls

✅ Responsive Preview Controls

Had to add fake-responsive classes to my previews to fake what breaks points would look like. It's been an interesting challenge. I can't say that I've solved for it in the cleanest way, but it's working, so 🤷‍♂️
🗓 Day 149: Responsive and Bugs

✅ Fixed overlay bug
🚧 Responsive WIP

Still working on responsive bugs. So many edge cases to account for. Happy with some of the bugs I fixed tonight. Another 1% better tonight.
🗓 Day 150: Responsive Bugs

✅ Responsive preview bugs zapped

Finished what I needed to do fairly quickly tonight. The responsive preview feature works nicely, even id the javascript is ugly. I could start on a new task, but instead I'm heading for my earliest night in weeks 🎉
🗓 Day 151: Small Refactors

✅ Small refactors

By the time I got to sit down this evening it was 11.45pm, I've shuffled some things around, cleaned up some bits, swapped out some icons and added a back button. Nothing impressive, but 1% better than last night.
🗓 Day 152: Small Refactors

✅ Small refactors

More teeny tiny tweaks because I could only start late tonight. Cleaned up the way a user can select or create a collection (category). Getting these small tasks out of the the way so I can tackle bigger tasks at the weekend.
🗓 Day 153: Livewire

✅ Watched tutorials
✅ Refactor
✅ Project plan

Watched tutorials in preparation for next chunk of work. Refactored a small file upload feature. Made a todo list for the weekend... doubt I'll be able to finish half of it.
🗓 Day 154: Submit Form

🚧 Form submission

Started trying to get my editor to submit all the data to the database again. I used to have this working when my editor was static and unstyled, it's stopped working since I made certain elements dynamic though.
🗓 Day 155: Submit Form

🚧 Form submission

Still trying to get my form submission, and it’s server side validation to work again. Struggling due to dynamic inputs, tiredness, and that I’ve forgotten half of my Laravel learnings from last year 😬

What my project feels like...
🗓 Day 156: Submit Form

🚧 Validation

Made a mess of getting this to work. So I switched tasks to tweaking visuals... although that didn’t move the needle forward at all.

Frustrated this evening, hitting a dip, so I’m setting a deadline... day 200... I’ll have beta users.
🗓 Day 157: Looong Day

✅ Built one baby's cot
✅ Re-prioritised features

After a long day of client work and Dad duties I didn't have the energy to be beaten by code today. So I re-evaluated my feature list, keeping the essentials, and removing the non-essentials.
🗓 Day 158: Like Counter

✅ Like Post

Added a little like counter. Toggles Like icons, will add an animation later. Currently set so that only registered users can like an item, but thinking of opening this up so that anyone can like. Need to think this through in more detail.
🗓 Day 159: Errors

✅ Styled errors

I hardcoded all the error messages and their styles for the editor. Just need to get validation and old values working properly and it should all come together.

Progress has been slow this week. 41 days to get this in the hands of testers.
🗓 Day 160: Research

✅ Pricing
✅ Landing

I did not have the energy for any code this evening, so I updated my pricing plan notes, researched competitors, and browsed inspiration. I’m going to try and do as much design work as I can this weekend so I have tasks for the week.
🗓 Day 161: Dashboard

✅ Wireframes

Wireframe exploration for the dashboard. Trying to keep things as simple and as clean as possible. Also trying to make a big table of data not look like a big table of data. Whilst it looks simple, the dev behind it will be more challenging.
🗓 Day 162: Dashboard

✅ Wireframes

Spent the majority of my day looking after our son whilst my wife worked, and celebrating Mother’s Day afterwards. I squeezed an hour of design in at the end of the day. Continuing to strip out features in order to get to market quicker.
🗓 Day 163: Dashboard

✅ Designs

Continued with design work tonight, still not happy with the flows that I’ve put together. I know I’m fussing over this particular interaction, but I believe it to be one of the most important parts of the app, so it’s worth getting right.
🗓 Day 164: Validation

✅ Code cleanup
✅ Old Values
🚧 Adding Validation
🚧 Adding AJAX

Received help today with getting Laravel's old values function to work with my Alpine components... turns out you can use Blade components in JS within a Blade file 🤯
🗓 Day 165: Validation

✅ Cleanup
🚧 Adding Validation
🚧 Adding AJAX

Jumped back into writing Laravel Tests this evening. I'm so rusty after having not wrote any tests since December! They're not all passing yet so I've definitely got some work to do tomorrow night.
🗓 Day 166: Validation

🚧 Validation
🚧 Select Template

Realised I didn't need to fetch template data using Alpine, I could just pass a Laravel Collection to a JS array and access the data I needed. Learning little tricks each day.
🗓 Day 167: UX

🚧 Create Post UX
🚧 Success UX
🚧 Share

I’ve been so focussed on the editor, that tonight I started focussing on the UX design before and after the editor. Tried to challenge all of my preconceptions. Definitely a bit of over-thinking going on 🧐
🗓 Day 168: Sketches

🚧 Sketching flows

I sat down this evening after a long day, opened my laptop, then realised I’d left my charger in the office yesterday. Not wanting to skip a day, I reached for paper and pen, and sketched out the flows I’ve been thinking through ✍️
🗓 Day 169: Visuals

🚧 Dashboard Visuals

Spent the day walking in the woods near our house with my wife and son, but I did pop back to the office to pickup my laptop charger, and spent an hour working up my sketches into visual designs.

Big development push coming this week.
🗓 Day 170: Visuals

✅ Dashboard Visuals
🚧 Axios

Wrapped up the dashboard design tonight, going to code the front end tomorrow. Watched some Axios tutorials, going to try and get that working too this week.

30 days until Beta users... there’s a lot left to do.
🗓 Day 171: Axios

🚧 Dashboard
🚧 Validation

Validation still giving me a headache. Refactored my validation rules in the backend, added alternative strings for errors, still working on getting Axios to work.

Starting tinkering on the front end of the dashboard.
🗓 Day 172: Vali-stupid-ation

🚧 Validation

Still working on making validation work for the editor. Not making as much progress as I would like this week.

Still showing up and trying though.
🗓 Day 173: Vali-bloody-ation

✅ Validation

Validation is now working thanks to @abdelilahlbardi. There is no way I would have figured this out on my own. It wasn’t a straight forward Laravel implementation and needed a little bit of magic 🪄

Thank you Abdelilah!
🗓 Day 174: Vue Tutorials

✅ Watched Vue JS Tuts

Intrigued by Vue. At this point I’m unsure if it will speed me up or slow me down. Probably slow me down. I should just finish what I’ve started 😬
🗓 Day 175: Validation is Back

🚧 Error Messages

Validation is back 😵 Still getting error messages to show for the dynamic fields. Simple inputs are showing but looping through arrays of dynamic is tripping me up.
🗓 Day 176: Validation 😴

🚧 Error Messages

Reverted back to some previous code that seems to have solved my conditional validation rules. But having trouble displaying Axios error messaged for nested arrays.

Developing can be extremely frustrating at times.
🗓 Day 177: Errors 😵

✅ Error messages
🚧 Dynamic error messages

I won! I figured out my error message problem after a little debug help session with @dave_stewart. Learned more about optional chaining operators, which was key in helping solve this problem.
🗓 Day 178: Errors

🚧 Dynamic error messages

So so close to wrapping this up. Could have done it tonight, but have had a really long day and so the sweet feeling of putting this one to bed will have to wait until tomorrow.
🗓 Day 179: Errors Finished

✅ Validation
✅ Error messages

Woo! Finally wrapped up displaying errors! I have a little trickery to implement so that error messages disappear when a user starts to correct the error (before form submission). Chuffed to have this part working.
🗓 Day 180: Flexbox

🤬 Flexbox issue

Spent two hours tonight trying to get a Flexbox issue to work. 90% of the way to fixing it. I just know I’ll wake up in the morning and the answer will hit me in the face.

20 days until beta users 😬
🗓 Day 181: 201 Success

✅ Flexbox issue
✅ First 201
✅ Validation bugs

Worked so late last night and got distracted by the the baby that I forgot to post an update. Shout out to @abdelilahlbardi who jumped on a call with me at 11pm on a Friday night to help troubleshoot.
🗓 Day 182: JSON Formatting

🚧 Formatting

Update for yesterday, fell asleep as I was working last night. Working on formatting my JSON response so that only the data I want gets saved and bad guys can’t just submit anything to the DB.

Hoping to finish this task tonight.
🗓 Day 183: JSON Formatting

🚧 JSON formatting

Sounds weird, but I just love JSON. Still working on the backend formatting of it for the database. Managed to sit down at 10.30pm and give it 90 minutes - interrupted a few times by the baby. Still more to do tomorrow night.
🗓 Day 184: Image Store

🚧 Image Store
🚧 Saved Templates

Laravel’s image store seems to have broken when using Axios. Trying to figure that out. I have a buggy version of saved templates working. Feels good to finally have it working (sort of). My bug fixing is improving!
🗓 Day 185: Success (kinda)

🚧 Saved Templates
✅ Success screen

Still putting out fires on the saved templates. Got my success screen working when a user creates a post. Just need to get the URL passed back and displayed now.
🗓 Day 186: Bug Fixes

🚧 Saved Templates

Still working on bug fixes for saved templates. I almost have everything working for this feature. There are some nice to haves that I've made a note of but I need to park these for later.

Two weeks until my beta user deadline!
🗓 Day 187: Bug Fixed!

✅ Fixed templates bug
✅ Added share options

I've been trying to fix a bug for 3 days, figured out where it was, and kind of why it was breaking but couldn't figure out how to fix it. Then @abdelilahlbardi came in and fixed it in 30 mins! Hero.
🗓 Day 188: Saving Files

✅ Fixed saving files
✅ Small bug fixes

Fixed a bug for saving files that are uploaded this evening. Made some other small bug fixes too. I need to move on to viewing posts now. I should be able to recycle lots of the editor code.
🗓 Day 189: View Posts

✅ Editor bug fixes
🚧 View Post

Laravel converts empty strings to null by default, which broke some of my editor. I fixed it and moved to coding viewing posts.

Feels good to have a change of scene and to not work on the editor.
🗓 Day 190: Copy Link

✅ Investigated view post
✅ Copy link

Investigated if my editor and view post be controlled by the same JSON so that they can use the same codebase. Ongoing.

Made a custom "Copy Link" feature using:


10 days to Beta!
🗓 Day 191: https Check

🚧 Check for https://
✅ Timeout on copied links

I spent far too long checking for "https://" on entered URLs. Still not fully working. And then I spent far too long getting a timeout function to work... turns out all I needed was to read the docs 😅
🗓 Day 192: Custom Domain

✅ Custom Domain research
✅ https:// fix

I’m not moving things forward as much as I would like. It’s difficult to get into anything meaningful in one hour at the end of a long day. Especially when you’re learning, that hour disappears fast!
🗓 Day 193: Beginner JS

🎓 http://BeginnerJavascript.com 

Decided to take a step back for a couple of days and go through Wes's course. Going slow now to go faster later. Hoping that it improves the speed of my work, because I need to go faster with the limited time that I have.
🗓 Day 194: Continued JS

🎓 Continued JS Course

Learning so much about the basics of JS. It’s sinking in and making sense this time. For years I’ve just fudged things, but taking time to step back and actually learn the basics is going to really allow me to move faster.
🗓 Day 195: Continued JS

🎓 Continued JS Course

Another 45 mins of learning on my lunch break. Hoping to finish the course this weekend, whilst also applying the learnings to my app. Big weekend push required.

Also need to do accounts for two of my companies though. Urgh.
🗓 Day 196: Continued JS

🎓 Continued JS Course

Another module down. Getting to grips with the DOM. A whole new world is opening up.

Slightly distracted by Prince Phillip’s funeral. What an incredible life he lead.
🗓 Day 197: Continued JS

🎓 Continued JS Course

Underestimated how long this course is, so I didn’t finish it this weekend as hoped.

It didn’t help my project that I spent last night with friends, and all day today with my fam. No regrets, this was the best wknd in a year!
🗓 Day 198: Dashboard

🚧 Started front end

Learning a lil JS was great for a few days, it’s given me more confidence to push on. Started putting together the dashboard views this evening. It was literally 40 mins of work after a very long day, but at least I started.
🗓 Day 199: Dashboard

🚧 Continued front end

Worked on the dashboard view these evening. Lots of UI coded up, just need to get some of the dynamic elements to work. Still not used to fetching data when required on the fly. Need to understand this more.

Tomorrow is day 200.
🗓 Day 200: Dashboard

🚧 Adding Alpine JS

Today marks 200 consecutive "days" of working on my SaaS. I thought it'd be shipped by now, or that I'd at least have beta users. But Nope. Because building software, when you don't know how, is bloody difficult.

*Approx 1-2 hours
You can follow @iamdavidhill.
Tip: mention @twtextapp on a Twitter thread with the keyword “unroll” to get a link to it.

Latest Threads Unrolled: