Saturday, 11 January 2025

2025 New Year Cont - Project State Of Play

Continuing the 'new year reflection'  theme,  I thought that I would use this post to list all of the projects that I currently have in-flight.  This is intended to hi-light my shameful habit of serially starting projects, and hopefully prompt me to do better this year. 

Here are the things I am currently working on

Software

  • Article Site simple SAAS
  • Text Adventure Engine (and text adventure)
  • C# port of FreeRDP
  • 'Big Idea' SAAS

Hardware

  • Hexbot Robot (and control software)
  • Cable driven robot arm

(These are the projects that I have at least 'touched' in the last 12 months. There is a litany of other abandoned ones that have been left by the wayside over the years.)

Of these, the Article Site simple SAAS project is the one that I have discussed most on this blog.  The other projects probably need a little more introduction. I'll expand on them below.

Text Adventure Engine


I have briefly mentioned this project in a previous post. This project is my attempt to make a text adventure engine in pure typescript that can be used to create a sophisticated text adventure with a simple JSON payload (e.g configuration only - no scripting required).   The goal for this project is to support the creation of multiple Infocom style text adventure games in the near future.
My vague idea is to use the medium of text adventures to have a fun project to work on as a relief from the more serious projects, while also improving my narrative skills.

C# port of FreeRDP


This project is an attempt to create a pure c# RDP Client, based on the FreeRDP open source C code base. The motivation here is that there doesn't seem to be a good RDP client that can be used with Unity (which uses C# as its base development language).
However, what I found while attempting is that the RDP protocol is very complicated, with multiple protocol layers, endian specific buffer programming and lots of crypto/security programming. 
I made progress despite that, but the project quickly became a drain - this is the sort of project that is large enough to require full time attention for while, and I have a lot of other things I want to look at instead.  The major downside here is that the end results of the project won't have enough return on investment compared with other things I wont to work on - the actual payoff for me will be quite low compared with the effort required.  This is more of a 'bragging rights' project than something I really need.
Even so, I haven't completely given up on this one and I do intend to pick it up again at some stage. It might get a post or two in the future.

Big Idea SAAS


This project will likely be the next SAAS project I tackle after completing the Article Site one.  I have a 'concept of a plan' for a SAAS site that has some potential to make actual money for paying customers, but I am still sketching things out and I don't want to make the idea public before making more progress. In particular, I  need to do some market testing to see if the idea has any traction.
For now, I am just going to say that this project is related to enabling code free implementation of Augmented Reality heads up displays for Industrial use.

Hexbot Robot


A while ago I bought one of these Hi-Wonder robot kits. The kit was pretty good, but I was disappointed by the ancient version of JetPack and ROS it shipped with.  I also found that the back current protection on the custom Hi-Wonder adaptor board for the Jetson wasn't great, as I managed to completely fry the Jetson nano while trying to charge the battery.

So, when life gives you lemons... make your own robot. I decided to modify the base hexbot to my own Frankenstein design and I've been plugging away at this project (on and off) for about a year now.

I'll make a more detailed post about the robot soon, but for now the main changes I have made are

  1. Replace the tiny supplied LiPO battery pack with an adaptor than can use power tool 18v pluggable battery packs (mission life of 45Wh)
  2. Replace the Jetson Nano with a Raspberry Pi 3 running Ubuntu (cheaper + less power drain)
  3. Rewrite the robot control software from scratch in python/ROS2 
This is a nice little project for boosting my robotics skills (which are more or less 'intermediate')
The hardware side has required a lot of 3D printing, customization and learning about serial servo control.
The software side has required a lot of python, base robotics knowledge and an improved understanding of legged robot control.

At the moment the robot can be powered on,  supports SSH control, can adopt various leg poses and has relative accurate inverse kinematic control (you can move each leg tip by a specific vector)

I am currently working on re-integrating the lidar module and depth camera, and creating a gait controller that will enable the robot to walk specific distances. The steps after than will be accurate turning and dead-reckoning navigation.

Cable-Driven Small Robot Arm


This project is an attempt to design and 3D print a 6DOF cable actuated robot arm that will be light weight enough to add onto a future upscaled hexbot.  The design uses rolling joints + a pulley system to ensure linear motion of all joints while minimizing the weight of the arm structure. So far I have a  prototype builds for the 3DOF wrist and for the elbow and shoulder joints, but they all still need to be integrated into a common structure.  (I don't have any mechanical engineering training, so most of this work is iterative try-it-and-see stuff ).  I'll try and make some more progress with this project in the near future.

Summary


So that's the current project list.  I am going to try hard to get to a decent milestone with at least one of these before starting anything else!

One thing I've noticed with the above project list is that it doesn't include any VR or 3D development (which is my day job), but that is probably for the best. I want to keep my home projects very much separated from my work.  If I work on anything in Unity or VR it will probably be commercially sensitive and I won't be able to talk about it here.

Anyway, that is probably enough for this post. Time to do some actual work.


Friday, 3 January 2025

2025. New Year Thoughts

 So its a New Year, and as its been a few months of writing this blog I thought I'd do a pulse check.  

In general I am happy with the progress.  I have managed to keep a reasonable cadence with posting, completely finish one simple project, make significant progress on a couple of others and along the way I have significantly improved/refreshed my web development skills.  

Of course, I haven't made any actual money yet - but then Rome wasn't built in a day.  I feel that I have started building some momentum though, If I can keep it up then eventually I might get somewhere.

However, I also want to change the mix a little and have a little more fun with this blog. Up until now it has been focused purely on side-hustle web development, but I also have a few other interests that I would like to occasionally cover.  Moving forwards, I am going to broaden the scope a little. The main focus will still be to somehow build a side hustle SAAS business, but I am going to be less rigidly focused on that one topic

My other interests include a whole bunch of areas. These include robotics, game development, science fiction, retro computing and even cabinet making. From now on, I'm going to reserve the right to post about anything that motivates me enough to write an article.

With that out of the way, what else do I want to achieve in 2025?  There are a few things:

  1. Keep a reasonable posting cadence with this blog
  2. Finish more projects.
  3. Get fit.
  4. Have more fun 
Points 3 and 4 are actually the most important.  2024 wasn't really a great year for me, and I'm not too upset to see the back of it. One of the motivations for starting this blog was as one way to start pulling myself out of a mental hole.  I think this (and other things)  might be working, but I want to go further.

Physical and mental fitness are linked, and my physical fitness has become terrible. Part of this is generic middle-age, but mostly it is just self-neglect.  I need to change that. 

Another thing I need to do is to give myself permission to spend time on things that I enjoy. The hustle/grind approach is just going to lead to more burn out. That is one of the reasons I am going to be less hustle focused with this blog.

So with all that being said, I have been working on another project for the last couple of weeks, but one that is more for my own amusement than for building a business.  I've been developing a text adventure engine in Typescript, as a precursor to writing one (or more) web based text adventure games.

Why? For a few of reasons.  One,  I have a nostalgic love for these sorts of games and I think the world could use more of them. Two, it gives me a way to continue to improve my Typescript/webdev skills but have some fun in the process. Three, it will hopefully enable me to also improve my writing skills. 
I don't think I have the chops to write anything long form at the moment, but I think that I should be able to manage a text adventure.

Anyway, this thing is now officially another Project, which means that not only do I have to finish it, I will also be posting about it in this blog.

One of the key requirements I am trying to meet is that the engine should enable an entire text adventure to be implemented as a JSON payload (e.g. with no additional coding). The engine should also be good enough to develop games as good as the classic games of the genre, such as The Hobbit, The Hitchhiker's Guide To The Galaxy etc.

So far it is coming along nicely, and I'll probably dive into more depth in future posts, but for now here are a couple of  teaser screen shots to end with









 
 

Saturday, 21 December 2024

Project 2 - Simple SAAS - Business Model

 

In the previous Project 2 post, I mentioned that one of the key outstanding design items was to come up with a business model for the site. I now have an idea of what I want to do, and this post I'll try and explain it.

The model is actually pretty simple:

The site will be based on a freemium model where all members will be able to post up to 5 articles for free. However, free articles will be (subtly) watermarked when then are viewed.  Something like this:





Subscribed users will be able to permanently post more articles ( 20?), and their published articles will not be watermarked as long as their subscription is active.

This model is simple, but it does hillight a couple of consideration points for a freemium business model

  1. What features do paid subscribers get that free users don't
  2. What happens when a subscription is cancelled. How do you gracefully remove the paid features when a subscription expires? 
In this case, I've chosen to watermark the pages for 'free plan' users, and to regress subscribed users to this model if they allow their subscription to expire. This should enable a few things

  • The site will be useable for free users, giving people an incentive to use the site as a free service
  • There will be tangible benefits for subscribing and maintaining a subscription, which should lead to people signing up for a subscription service assuming that is is appropriately priced.
  • The penalty for letting a subscription lapse will be minor - all paid published articles will be permanently available, but will simply incur a watermark if the subscription lapses.
I'm reasonable happy with this concept.  It still needs some work (how much will the paid plan be per year? how many articles will this allow? How exactly will the free articles be watermarked), but this is enough to move forwards with.

With this concept sketched out, I am ready to start integrating the site into some real world services. I'll cover that process in future posts.

 

Tuesday, 17 December 2024

Interlude - Sickness and distractions

 Ugh. I've been sick. A nasty flu and a bonus round of bronchitis because I am just that lucky. 

As such, I haven't really been focused on moving forwards with Project 2.  Instead I've allowed myself to get distracted and started a couple of other things on the side. Did I mention that one of my biggest flaws is that I am great at starting things and terrible at finishing them? I think I might have.

However, it turns out that one of the projects was something simple that I was able to finish in a couple of days. As well as being terrible at finishing projects that I have started, I am also terrible at making decisions regarding what to work one.  I  dither so much over the 'what shall I work on today' question that I often just give up on being productive and choose brain rot instead. 

To fix that, I made a simple tool to help make decisions.  https://thedecisionator.com/ lets you create a list of choices to make, and then will randomly pick a choice from that list for you.  The lists of choices are stored to local browser storage, so they will persist between browser sessions on the same device




The site is another Vue/Vuetify/Typescript site that I've deployed via Cloud Flare pages.  It is intentionally bare bones, but it gets the job done.  The next time that I need to choose what to work on, I'll be covered!

Since one of the themes of this blog is side hustles and money making, it is interesting to consider if or how this site could be turned into a side hustle.  On the face of it, there don't seem to be too many options

  • The site is too simple for advertisers to consider, it is unlikely to pass a provider review
  • There is no realistic opportunity to 'upsell' to a  paid model.
  • There isn't anything to subscribe t
About the only avenue I can think of is adding a donation link. I might look at this later.. but this would need some serious traffic numbers to be viable. This leads to marketing/traffic/seo considerations that I need to get across but which probably aren't worth it for a simple tool.

For not I am just happy to have something that I can use to help me be more decisive.  I might come back to making this a more profitable exercise later if I think of a good idea.

 



Saturday, 30 November 2024

Project 2 - UI Scaffolding progress

 Over the last couple of weeks I have been working on scaffolding the key features of my simple article publishing project, while trying to actively avoid getting distracted by constant fiddling with the fine details of UX.  As a reminder, I am trying to create a very simple, but feature complete SAAS website so that I can build a better understanding of how to integrate the back-end services like Auth, Database, Payments, Helpdesk for a real SAAS site.

In my previous post I detailed how I am using a services pattern and in-memory repositories to separate the front-end UI from these back-end concerns, to avoid having to solve too many problems at once.  This also allows me to focus on making sure that the key features of the site - which in general are the features that will attract paying customers - are valid, working and stable. This prevents losing time implementing back-end integrations for features that are in flux, or which are poorly thought out.

As a case in point,  one of the key features for an article editing an publishing site is actually being able to create and edit an article.  My initial idea here was to use a markdown style approach - users would enter wiki-style markdown which would get transformed into a page when the article was previewed or published.

By implementing the UI first, it quickly became apparent that this approach was clumsy, overly technical and would turn off a lot of prospective customers. Instead I opted to implement a rich text editor based on VueQuill, and this greatly streamlined the user experience for creating articles - which is one of the core features of the site. Focusing on the core UI enabled me to make this switch with minimal impact - as no backend changes needed to be made.

Rule of thumb for future SAAS work: scaffold the core features first. Focus on getting the stuff that users are gong to pay for working before worrying about pesky details like security, db schema, payments etc.

Anyway, here is the list of features that are more or less working:

(remember, the UX here is a work-in-progress!)

The site is a responsive layout, with a fixed width for user interaction and fluid gutters. This may change in future, but it seems to make sense for now.  

It has a dedicated members/dashboard area that supports navigation, managing articles, managing the user's account and getting help/support

Each member page is an 'invisible scroller', enabling the user to scroll content vertically without requiring browser scroll bars. Each page also has built-in feedback features, providing common notification and dialog services for page actions:



The article management features are implemented using a master/detail list pattern, where the user can create, edit, delete, publish, unpublish and view their articles



Article creation or editing uses VueQuill as a WYSIWYG rich text editor:


There is a scaffolded Account management page:


and a scaffolded support page, using a hosted support form from FreshDesk (more about this in future posts)


Published articles are available for viewing by the public:


Obviously the site is by no means complete, but the core UI features are mostly there. 

The main outstanding feature is implementing the business model for the site - adding (or restricting!) features based on user payments.  This will be my next focus, and I'll try and report progress in the next post.







Saturday, 16 November 2024

Interlude - some distractions

 A few things have been happening lately which have reduced the velocity of my current project: 

  1. I had some ideas for my 'big idea' SAAS that I wanted to spike out
  2. Liberal democracy and the rule of law apparently imploded in the United States.
  3. BlueSky took off and I've been having a lot of fun being a post goblin on a site that feels like Twitter in 2010.

The items above contributed to a motivation slump for Project 2.  There is a lot going on and it is difficult to find to motivation for building a fully fledged solution purely as an academic exercise - even if the learning potential is huge.

That being said t,  one of my key self-improvement objectives is to actually finish projects that I start and NOT give up when I hit a slump.   I will get this thing 'functionally' complete and deployed even if it is just for personal bragging rights.

Apart from the above distractions, I think there are two things killing my want to continue with this project

  1. It is basically pointless as a SAAS - the chances of making money are so low as to be non-existent
  2. UX design is really hard. I can write competent code, but even with all of the tools of Vuetify and modern CSS at my disposal I can't make it so that the website 'looks professional'.  There are just too many UX tricks of the trade that I don't seem to know. Having the artistic talents of a brick also does not help.
Item 1 I can probably cope with. Ultimately this  project 'is a learning by doing' exercise and I just need to suck up the fact that it probably isn't going to be anything else.  

Item 2 is a really an issue for me. When working on the solution I get easily distracted by the low quality look and feel and then started fiddling with things to 'improve it'.  This doesn't usually have a good outcome (ok, the end results are terrible) and wastes a lot of time.    

Moving forwards I am going to have to be more disciplined about this and stick to also scaffolding the UX .  Once the site is functionally complete I will look for a pre-built template that I can migrate it to.  

I need to eat some humble pie here. For most of my career I have looked at UX designers and thought 
"that's all you do? I could do that if I could be bothered but I want to write code instead".  It turns out that no - I can't do that and I don't have the bandwidth to learn.  

Today's personal lesson is to stick to your strengths and download/buy/hire for the skills you don't.  

Sunday, 10 November 2024

Project 2 - Simplest SAAS - Service Scaffolding

 In this post I'll discuss how I intend to scaffold the article site SAAS so that I can build out the key features without having to worry about integration with back-end services.

The basic idea here will be to take a layered approach, and use an implementation of the Service Layer pattern to encapsulate all of the core business functions of the site.  There will be services responsible for each of the key features of the site - one for user management, one for article management etc.  Services will act as mediators between the Vue components and and back-end logic. The Vue components in the site will only interact with these services and will  never interact directly with a back-end provider.

In addition I will use the Dependency Injection pattern to construct these services.  Where one of these logical service has a dependency on a high layer,  a typescript Interface will be used to define the operations of that layer, and the service will be constructed with a class that implements that interface. 

The Dependency Injection pattern makes it possible to swap different implementations of the service dependencies without requiring the service to be modified.  The Vue components are isolated from any changes to how the back-end dependencies are written,

This in-turn will enable me to create in-memory, scaffolded versions of these key dependencies (user auth, persistence, payment etc)  to get the site running, then enable me to swap to actual implementations with minimal work.  This has the nice advantage of enabling back-end services to be swapped out without affecting the user interface. For example, with this approach I can potentially switch between database host providers minimal impact on the UI. It also simplifies testing - the services can be tested with mocked or faked versions of dependencies if required.

For working with persistent data,  the Repository pattern is often used with Dependency Injection.  A Repository is a specialised service dependency that abstracts all persistence (database) operations behind a well-defined interface - which is exactly what we want!

Here is an example of how this will work for the design requirement of providing the user with a list of the articles that they own.    

  1. The List Articles page (a Vue component) will invoke the get_user_articles() method that is defined on the Article Service.
  2. The Article service will be constructed with an instance of a class that implements the IArticleRepository interface. This interface also defines a get_user_articles() method 
  3. There can be multiple classes that implement this interface.  Any of them can be chosen at design time to construct the service
  4. Initially, I will use an Repository implementation that uses a simple in-memory store to persist user articles (this will reset every time the site is started).  Eventually I will replace this with a Repository implementation that uses a hosted database.
  5. The List Articles page doesn't care which implementation of IArticleRepository is used. It only interacts with the Article Service, and the behaviour of this service never changes. 
  6. This means that the List Articles page can be safely built to work with a simple in-memory implementation of the repository, and no changes to this component will be required when the Article Service is swapped to using a repository implementation that works with a  hosted database



One other thing I should also mention is that the data types that are sent to and from the the dependent layers should also be defined. This enables a type safe definition of each interface.  For the example above, as well as defining the IArticleRepository interface, we should also define an Article type for the repository to return.  These data types can be thought of as the Models in our design.

Using this approach takes some initial set up but I believe that it will pay significant dividends in enabling me to set up a fully featured user interface without having to worry about the complexities of integrating back-end services. I can focus on implementing the core features of the site first and save significant time on my first few iterations.

Moving Blog Platforms

 After struggling for weeks with Google Search Console and Blogger settings, I've come to the conclusion that I need to move to a differ...