• Test Post Written Using Github

    For web development enquiries feel free to contact me via email.

    Just a quick test to see if it’s possible to write a blog post directly in Github.

    Usually when you push to Github using git, it triggers Jekyll to rebuild the static site, but I don’t know if that happens if you save the file directly to the repo without a push. Based on this stack overflow post looks like it probably doesn’t but figured I would test it out just in case.

    Update 1: It worked! My first attempt didn’t work because I forgot the .md file extension, once I got the file name right, the build was automatically triggered. Saving the file now should result in another build which will add this update.

    Update 2: The update resulted in a site build too :)

    Update 3: However I now see that though there is an edit button for files that already exist, there is no “create new file” button in the mobile version of guthub.com :(

  • List of remote friendly web development job board websites

    For web development enquiries feel free to contact me via email.

    When looking for remote web development opportunities there are broadly two categories - freelancing and remote positions.

    Here is a list of websites for finding remote position opportunities:

    List of remote friendly companies:

    Also worth checking out is this list of resources for remote workers.

    For freelancing check out my list of freelance web development websites and marketplaces.

  • List of freelance web development websites and marketplaces

    For web development enquiries feel free to contact me via email.

    When looking for remote web development opportunities there are broadly two categories - freelancing and remote positions.

    Here is a list of websites for finding freelancing opportunities:

    Also worth checking out is this article that has lots of details about freelance contracts.

    For remote positions check out my list of remote friendly web development job board websites.

  • Setting up as a freelance web developer

    For web development enquiries feel free to contact me via email.

    There are lots of reasons for doing freelance work, whether it’s for what people refer to as a side hustle or whether it’s more of a full time freelancing goal, but in all cases it’s necessary to have a minimal infrastructure setup. You fine tune this over time and adjust according to the direction of the projects. Broadly speaking the essentials are payments, contracts and some form of marketing.

    I got some of the details from this article from an audio on soundcloud called Web dev freelancing high level overview basic setup. The author makes some good points and is worth the listen.

    Payments

    Freelancers need a way to receive payments. There are a lot of online services that specialise in providing services for freelancers. Freshbooks seems to be a favorite for a lot of web developer freelancers. I hear it mentioned a lot on podcasts. Whichever service you choose, you will need to create an account, connect it to Paypal, and connect it to your checking account. It’s a good idea to setup a seperate checking account for your freelancing work than your personal banking account. Then it’s a good idea to test out the setup by sending a $1 invoice from Freshbooks, pay and ensure that the money reaches your paypal and then bank account.

    Another possibility here is to use a partly self hosted solution. You will need some web development skills, but you could use the Freelancer project (One of my projects) to host a payment site that uses Stripe as the backend payment provider. You can host the code on a public Github repo, so customers can inspect the code if they want.

    Joan from Toptal contacted me after reading this post to inform me that they have just released a freelance calculator tool that could be useful to easily figure out your hourly rate and yearly income. Thanks Joan!

    Contracts

    You will need some basic freelancer contracts that will clearly set out the project goals and responsibilities, and a way to send these contracts back and forth securly. Docusign has been recommended a lot, but there are other similar services available online, easily findable via Google search.

    As far as the contract google search ‘standard exchange of services contract’ or ‘web development contract’ and use one of these as the basis for your contract. Make sure that the contract contains at least the following:

    • State that you will build website, describe the website, pages, api etc
    • State the price for building the website
    • Client will pay 1/3 before, 1/3 midway, 1/3 at the end
    • After contract finishes, will leave project
    • Hourly rate applicable for maintenance after contract finishes, should be arranged as a seperate engagment

    Also worth checking out is this article that has lots of details about freelance contracts.

    Marketing

    Some way to promote your services, this doesn’t need to be too envolved initially.

    A basic website with a logo, contact details, short description of the services offered. Something you can add to the footer of your emails, it will be useful for referals too, a way for other to point people towards you. You might want to setup a blog at some stage, but initially a basic 1 page website should be enough.

    How to deliver

    General advice is to deliver a working website using new accounts for hosting and give these to customer as a deliverable. Hosting your customers website is not advised.

    Now you have the basic infrastructure to make proposals, draft contracts, and receive payments.

    Related posts:

    List of freelance web development websites and marketplaces

    List of remote friendly web development job board websites

  • New Linkblog feature: rss, atom and json feeds

    For web development enquiries feel free to contact me via email.

    The latest linkblog feature is feeds. These are a versions of your linkblog that are easily readable by a computer. This makes it easier for people to read your linkblog but also enables you to do neat things like auto post your links to social media such as Twitter and Facebook. Each time a day finishes where you posted links, the hash link of that day gets added to your feed.

    Linkblog rss, atom and json feeds

    To access your feed, right click on the icon in the toolbar (it looks a bit like the Wifi symbol rotated by 45 degrees) and select copy link address. This should copy the url of your feed to your computer’s clipboard.

    If you then paste it into some form of text editor you will see what the feed url looks like. Here are my feeds for my regular linkblog and for my custom domain linkblog:

    https://linkblog.io/users/mark/feeds/daily/rss
    https://links.markjgsmith.com/feeds/daily/rss
    

    The advantge of using your custom domain url is that theorectically if you ever needed to move your linkblog to another provider, then as long as you still own the custom domain, that could be done without the people already using your feed having to update to a new url.

    If you try to load these pages in a browser you’ll see lots of strange looking text with HTML tags, but you will also notice that your daily posts are within <item> elements. Computers can read these feeds easily. The vaste majority of the time though you never need to read the actual feed, you only really have to copy and paste the urls of the feed.

    The most common type of feed is RSS so that’s what is used in your navbar. Atom and JSON versions of the feed are also available by replacing ‘rss’ in the url with ‘atom’ or ‘json’.

    A very typical thing people do with feeds is add them to their feed reader, which makes it possible to read many sites from 1 place rather than have to remember to visit all the sites individually. Seen like this, feeds are very similar to the follow feature in many social media sites, they have the advantage of working across many different sites, though they are a bit more complicated.

    Feeds also make it possible to do things automatically with your posts, like posting them to sites like Twitter or Facebook. For example I have setup my linkblog so days are posted to my Twitter account @markjgsmith. There are lots of 3rd party online sites that offer rss-to-[insert favorite social media site] type services.

    For a more detailed description about feeds check out the You Need Feeds site. Also useful is this list of rss feeds for social media sites which might give you some ideas about what is possible.

    If you want to try out running a linkblog then signup for the 14 day free trial, after the trial it’s just a few dollars per year.

  • New Linkblog feature: highlightable messages

    For web development enquiries feel free to contact me via email.

    A big part of linkblog is the ability to see the context around a link, to see the other links that were posted on that day. It’s been possible to link directly to a day in your linkblog since the beginning. But until now, it hasn’t been possible to link directly to a specific message in a day.

    For example here is the link to yesterday in my linkblog. These day urls are copyable from the hash link (#) next to each day.

    The latest feature is the ability to link directly to a specific message in a day. When the page loads from a highlightable message url, the message that is specified in the url will momentarily be highlighted. After a few seconds the highlight will fade back to the regular linkblog page. This strikes a good balance between being able to point directly at a specific message while also keeping the context around the message focussed.

    Linkblog Redesign - Landing page 1

    After loading a linkblog using a highlightable message url you will know which message was being referenced but also be able to see clearly the context of that message. Note that you have to have javascript enabled in your browser for the feature to work.

    One challenge implementing this feature was how to do it while minimising the effects on the linkblog page. Adding a clickable element next to each message on the page to copy the url to the clipboard would negatively impact the minimalism and readability of the page. For the moment the way to get a highlightable message url is from the search page.

    Each message in the search page results has a highlightable message url as the hash link. Since most often users will probably be searching for the most recent messages, I’ve updated the search page so that performing a search with an empty search box returns all the messages with latest listed first.

    Linkblog Redesign - Landing page 1

    I hope you enjoy the new feature!

  • Steady and stable progress

    For web development enquiries feel free to contact me via email.

    Along with the linkblog site redesign and more recent foundations building, I’ve made steady progress with other items too, including:

    • Improved useability during signup, activation and onboarding
    • Built foundation for upcoming SSL for Custom Domains feature
    • Added tags to profile page data exports
    • Optimizations for custom domains
    • Database connection improvements
    • Kept 3rd party modules up to date
    • Faq and privacy pages updates
    • Code build and deploy system overhaul
    • Server provisioning system overhaul
    • Refactored analytics for better anonymization
    • Improved security with CSP policy
    • Improved integration and unit tests
    • Frontend optimizations by using compiled templates on client
    • Better data validation

    Because of previous work done to build a staging environment and load balance the site across several nodes I’ve been able to make all these changes while keeping downtimes to a minimum.

    Here is the status page for the previous month:

    Linkblog status page - November 2019

  • Building the foundations for the future of linkblog

    For web development enquiries feel free to contact me via email.

    Earlier in the year I did a pretty big redesign of the site which lead to upgrading the style framework which ended up being rather a lot of work, but the site looks great now and still minimalist. The redesign resulted in me building and introducing 3 new core components:

    • Redesigned billing system - Compliance with EU Regulation
    • Scheduler - Periodically runs jobs completely separate from handling website requests
    • Queues - Mechanism to co-ordinate scheduled jobs in a fault tolerant way

    This post gives a bit of description around these components, because although they are not directly visible in the linkblog UI, you might find it interesting to know some of the details of how the site operates under the hood, and maybe give you a bit of an idea of the possible directions for the future.

    If you’ve been following the news you might have noticed that there has been a wave of introductions of new internet regulations all around the world. In the EU they have introduced Strong Customer Authentication (SCA) which affects linkblog because the servers on which the site runs are hosted in the UK. The new rules meant a complete redesign of the billing system and with only 60 days notice. The previous integration with the payment processor Stripe was using their Checkout product, which was simple to setup but doesn’t meet the new EU regulations. The re-architected integration is more complex and uses a combination of Stripe Elements for the UI and the new Stripe Intents API which complies with the latest EU regulations.

    The billing system is now active and whereas previously it could only handle 1 type of subscription, it’s now ready to handle multiple subscription types, the first addition to the Linkblog Basic subscription is likely going to be SSL for Custom Domains, the plan is to slowly add new services to compliment the basic functionality.

    As part of the billing system redesign, it became apparent that I needed a way to receive status updates from Stripe called webhooks. Handling the webhooks is non-trivial because an acknowledgment has to be returned immediately, the same webhooks sometimes get sent multiple times, the order isn’t always guarantied, the task necessary to process the webhook differs depending on the type of webhook received and processing tasks take varying lengths of time to complete.

    The strategy I settled on was to record the incoming webhooks in the database, respond to Stripe, and have a scheduler component run jobs to periodically process the recorded webhooks. I had to restructure the app quite a bit to be able to handle regular website requests and also separately run scheduled jobs. This is a good strategy but problems occurred because when a cluster node was rebooted, there was the possibility of jobs failing midway through and not completing.

    To make the setup fault tolerant I had to build a queuing system to help orchestrate the scheduled jobs. The queues are hosted on a separate machine to the website cluster nodes, and the scheduled jobs which periodically run on these read and write messages to the queues during execution. Queues are useful because if a website node goes down midway through a job, another node can automatically pick up the job and finish the processing when it sees the item in the queue didn’t complete within a certain timeout period.

    So a webhook arrives, is recorded in the database, and scheduled jobs run and add messages to the appropriate processing queue. These queues are monitored by more specific scheduled jobs running on the nodes which take new items off the queues and carry out the appropriate processing tasks, for example sending out email notifications.

    The cool thing about queues is that they can be used for lots of tasks that don’t need to be part of handling website requests. I’m hoping to migrate a bunch of tasks like data exports and generating custom domain certificates to use the queuing system in the near future. Being able to off-load tasks to the queues will keep the site performing well.

    The new billing system, the scheduler and queues are 3 core components that are fundamental going forward.

  • Linkblog new look

    For web development enquiries feel free to contact me via email.

    Linkblog has had a site redesign!

    The redesign was actually done and released several months ago, but there were quite a few changes needed after the redesign so this is the first chance I’ve had to blog about it.

    Part of what I learnt from the launch on Indie Hackers was that people really wanted a way to try out the software before committing to a subscription. So as part of the redesign I also updated the signup process so that the initial signup creates a 14 day free trial (no credit card required).

    Linkblog Redesign - Landing page 1

    Linkblog Redesign - Landing page 2

    Linkblog Redesign - Landing page 3

    The redesign itself is based on one of the free bootstrap themes from Themes For App, I customised one of the themes to create the main landing page, signup and signin pages.

    Linkblog Redesign - Main page

    The rest of the site needed a bit of a refurbish so I decided it was a good time to upgrade the style framework I use called Bootstrap from v3 to the latest v4. I was able to get rid of some rather crufty old frontend code and replace it with new bootstrap components that use solid and modern CSS. Visually the site is a lot cleaner, the most obvious change is the toolbar along the top of the page which has changed from solid black to a lighter grey, which I think along with the other improvements in the latest Bootstrap results in a site that is nice to use and keeps with the minimalist ethos.

    One big issue was that the latest Bootstrap broke the site content security policy (CSP) which ensures that only the right 3rd party libraries get loaded into the pages. There was a related CSP issue on the repo and with the help of the commenters I found a workaround to make sure that the site is still secure. According to the bootstrap devs, the CSP issues will be addressed in v5.

    Little did I know that the redesign was only the beginning of a long voyage of discovery, though there wasn’t a whole lot of actual movement so it’s more a voyage of the mind and keyboard. I’ll be following up this post with a summary of the recent major changes in the linkblog foundations.

    I hope you like the new look!

  • Linkblog featured on 10words

    For web development enquiries feel free to contact me via email.

    Linkblog is featured today on 10words.io, currently on the homepage and will also go out via their newsletter and twitter!

    To all the 10words readers - thanks for stoping by!

    Linkblog on 10words

    A good example of a linkblog is my linkblog which I also publish using the custom domain feature so that it nicely fits in with my other web presences.

    Some other examples of use are posting links to blog posts and finding a video you watched last year and the latest feature addition is the navbar globe icon. Running a linkblog is a great way to build some context around what you are doing.

    This blog post wouldn’t be complete without a coupon code. If you’ve read this far then you’re at least curious, if you use coupon code 10WORDS at check out get 30% discount on your first year, and it’s a 30 day money back guaranty.

  • New Linkblog feature: navbar globe icon

    For web development enquiries feel free to contact me via email.

    The navbar globe icon feature adds a way to link to your other online sites. To set it up, simply update the url form field on your user profile page. Then a globe icon will render in your public linkblog’s navbar that loads that url when clicked.

    It’s a minimalist way to link to your other sites from your linkblog, so visitors can find your other presences online. In the screenshot below notice the globe icon in the top right just next to the search icon, and in my case it links to my homepage, which has links to all my other online sites, so visitors have a way to find among others my blog, twitter, linkedin.

    See it in action here.

    Linkblog globe icon

  • The dead simple todos system

    For web development enquiries feel free to contact me via email.

    Over the years I’ve tried a variety of sofware solutions to todo lists but I always find that eventually I end up just opening a empty file and typing a text list. It’s just so straight forward. Almost as if writing a list in a notebook, which of course is the ultimate todo list solution.

    Anyhow I’ve been adding quite a lot of aliases to my dotfiles recently and I wondered if I could add just a few that would make the bare essentials of a todo list system. These are the aliases that I came up with:

    alias 'slugd=date +%Y-%m-%d'
    alias 'todos=cd $TODOS_DIR'
    alias 'tdf=echo $TODOS_DIR/$(ls $TODOS_DIR | tail -n 1)'
    alias 'tdt=echo $TODOS_DIR/$(slugd).txt'
    alias 'tde=e $(tdf)'
    alias 'tdd=echo "### $(date "+%A %d %B, %Y") ###"'
    alias 'tda=cat $(tdf); echo'
    alias 'tdc=cat $(tdf) | grep "[x]"'
    alias 'tdi=cat $(tdf) | grep "\[ ]"'
    alias 'tdn=TODOS=$(tdi); ! test -f $(tdt) && tdd > $TODOS_DIR/$(slugd).txt && echo >> $(tdf) && echo "$TODOS" >> $(tdf) && tda'

    It’s all very standard shell scripting, the aliases get loaded from .bash_aliases or similar. The only complicated one is tdn which only creates the new todos file if one doesn’t already exist for the current day to avoid accidentally overwritting an existing list.

    • slugd - create slug using date
    • todos - fast navigation to $TODO_DIR
    • tdf - (file) prints latest existing todo file path
    • tdt - (today) prints file path using todays date
    • tde - (edit) opens latest todo file in editor
    • tdd - (date) prints todays date nicely formated
    • tda - (all) prints all todos from latest todo file
    • tdc - (complete) prints all completed todos from latest todo file
    • tdi - (incomplete) prints all incomplete todos from latest todo file
    • tdn - (new) new todo file extracting all incomplete from previous

    In practive the only aliases you actually use are tdn, tda and tde. That’s it just 3 aliases to remember and it’s pretty close to using a notebook. The only configuration necessary is to set TODOS_DIR environment variable somewhere that gets loaded by the shell automically like your shell’s .bashrc file.

    Here is what a todo list file looks like:

    ~ $ tda
    ### Saturday 07 July, 2018 ###
    
    [ ] Install new theme on blog
    [ ] Deploy live keys to payments pages
    [ ] Troubleshoot failed mail deliveries
    [ ] Add links to freelancer github repo on payment pages
    [x] Troubleshoot github remotes issue on markjgsmith.com
    [x] Troubleshoot freelancer left pane image centering issue
    [ ] Re-organise dotfiles and dotfiles local
    [x] Add todo aliases to dotfiles
    [ ] New blog post: The dead simple todos system
    
    ~ $

    The real test of course is tomorrow morning when I create a new todo list.

  • Commands I ran to install rbenv and upgrade ruby versions

    For web development enquiries feel free to contact me via email.

    I was able to upgrade ruby versions. These are the commands I had to run. I will spare you the error messages and detours.

    ~ $ ruby -v
    ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]
    
    # Commands to install rbenv and latest ruby
    brew doctor
    brew update
    brew install rbenv
    echo export PATH=$HOME/.rbenv/shims:$PATH >> $HOME/.bashrc
    brew upgrade ruby-build
    rbenv install --list
    rbenv install 2.5.1
    echo 2.5.1 > ~/.rbenv/version
    rbenv rehash
    rbenv versions
    gem env
    gem install bundler
    
    ~ $ ruby -v
    ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin15]
    
    # Re-install the gems in the blog installation directory
    bundle install
    bundle show jekyll
    bundle exec jekyll serve

    These are essentially the commands I ran, roughly in that order but it got a bit confusing somewhere in the middle.

    I decided not to run rbenv init, the only mandatory thing it does is add the shims folder to the PATH. So I just did that myself.

  • Ruby jargon to Nodejs jargon translation

    For web development enquiries feel free to contact me via email.

    I’ve been making quite a lot of modifications to the blog recently. The blog is generated by Jekyll a tool written in the ruby programming language. I have been seeing a lot of warning messages about ruby versions during builds, so it’s time to try to figure out what’s going on.

    Everytime I’ve ventured into this area it’s been full of confusing articles and definitions that don’t seem to quite match up. I found an article comparing the rvm and rbenv ruby version managers, which along with my browsing various ruby sites and blogs and quite a lot of head scratching resulted in the followng translation which might be of use to other nodejs developers:

    • ruby === node
    • rubbies === versions of node
    • RubyGems.org === npmjs.com
    • gems === node modules (packages hosted on npmjs.com)
    • gemsets === node_modules folders (there can be many)
    • Gemfile === package.json
    • gem === npm
    • bundler === yarn
    • rvm === nvm
    • rbenv === simpler rvm

    Something to be aware of is that rvm apparently also overides the system cd command to automatically set ruby on directory change which might not be desirable.

    I don’t claim that the list of correct, it’s just what I’ve come up with so far. Email me with any corrections.

  • Description of my freelance Nodejs software services

    For web development enquiries feel free to contact me via email.

    The consultancy service is very straight forward, it covers any aspect of building cloud web applications and is delivered via Skype call. It is customizable to the clients needs but generally covers architecture, building and deployment as well as things like efficient setup of developer environments.

    The infrastructure service deliverable is a running cloud based system ready for web application deployment. There are lot of tweaks necessary over and above the vanilla Ubuntu install that your cloud provider offers, such as machine access, cloud provider environment setup, firewall rules, logs, 3rd party applications installation and configuration, user accounts, aliases, SSL certificates, cron jobs to name a few. This services covers all these and does it at 3 complexity levels depending on the size of your installation.

    The maintenance service is aimed at maintenance and support of a web application infrastructure. It should be used for upgrades, improvements and customizations to an existing infrastructure.

    The development service covers the development of Nodejs based web applications and could cover any type of application. I recommend doing some consultancy services sessions first to determine the application specifics before starting a development services engagement.

    The writing service is aimed at internet publications that wish to create content for their websites. It could cover any aspects of web development, and might be in the form of a tutorial or perhaps an essay expressing an opinion on a particular aspect of modern technology. The details could be fleshed out via a short consultancy service.

    The pricing page has the full list of the packages for each service.If you would like to purchase some software services visit the payments page.

  • How I use my linkblog - posting a link to my latest blog post

    For web development enquiries feel free to contact me via email.

    Situation:

    Earlier I wrote a how to blog post. It would be nice to add it to my linkblog timeline in case anyone stumbles across my linkblog. Then they might get a better idea of how a linkblog might be useful. It might also be interesting to others that are building software and writing documentation to see my flow.

    Solution:

    I open the post in my web browser, load the blog post I just wrote and click the bookmarklet in my browser bookmarks bar. I added the popup bookmarklet to my browser bookmarks bar when I setup my linkblog account.

    Linkblog popup bookmarklet

    The popup window appears and I add the text “New Post:” to the start of the message text. When I am linking to a blog post I wrote, I always add this prefix so that I can easily search for them later, and it also draws a bit of attention to the link for people that might read my linkblog.

    Linkblog popup bookmarklet edit message text

    I click on the ‘Meta’ tab and add some tags. While typing the tags, a drop down appears under the tag box to suggest tags that I have previously used in posts. I click the tag in the drop down and it autocompletes the tag in the tag boz or just continue typing and hit enter when I am done typing the tag. Tags can have spaces in them but no underscores.

    I jump back to the main tab and click the “Post Message” button. The window disappears as if it was never there. I open my linkblog and find that a new item has been posted linking to the blog post.

    Linkblog popup bookmarklet add tags

  • How I use my linkblog - finding a git tutorial I watched last year

    For web development enquiries feel free to contact me via email.

    Situation:

    I need to commit some changes to my dotfiles, when I do a git diff I see that there are two distinct changes that have been made because I must have forgotten to check the previous change in, no doubt I was distracted by something much more impotant at the time. The world is like that sometimes. Other people are just so me me me sometimes. :)

    I could check these commits in one commit, it’s no big deal, they are my dotfiles in any case, it won’t matter really. On the other hand I know there is a git command just for this called patch, but I don’t use it very often and I don’t remember the flow. However I do remember that I watched a tutorial on youtube but it was a long time ago, at least a year. I did post a link to it on my linkblog because it was quite a good video. Might as well learn it now, plus I can write a how to blog post.

    Solution:

    So I open up my linkblog on the search page. I search for: git patch “youtube.com”

    Linkblog search

    Adding the url in quotes returns exact matches for the url. I hit the search button and receive a load of results. I use the browser in page search by doing ctr-f and type ‘patch’ in the browser search box window that opens in the top right of the browser. I hit enter and all occurrances of patch are highlighted in yellow. Hitting enter a few more times and the focus jumps down the page and BAM there is the tutorial: “Intro to git patch mode tutorial”. As an added bonus I notice that there is another video I posted about git patch right above it. Cool!

    Linkblog search results

    I click the cmd-click the domain at the end of the line and a new browser window tab opens up loading the youtube video. Oh so THAT’s how to git patch!

    Here is a link to that day in my linkblog timeline. The video was by a chap named John Karey. Thanks for the video John.

  • Things I learnt as a solo developer building Linkblog.io

    For web development enquiries feel free to contact me via email.

    Building a web application as a solo developer ain’t easy. There are an insane amount of things that need to be done and an almost unimaginable amount of decisions that need to be made…but it’s possible.

    I wanted to take a few minutes to reflect on some of the things that I’ve learnt along the way:

    • selecting the right technologies
    • setting up consistent development environment
    • using unix/linux tools effectively
    • building a deployment pipeline
    • architecting the app
    • building a scaleable infrastructure
    • testing, linting, logging, debugging
    • securing components
    • scripting and automation
    • setting up server side and client side analytics

    If you are a solo developer / small team just starting out on your building journey, feel free to get in touch tell me a bit about yourself. All these things are very fresh in my mind right now, and I am available for consulting gigs! Investing a bit of time and money now might save you weeks if not months of headaches later down the line.

  • Launch on Indie Hackers

    For web development enquiries feel free to contact me via email.

    I unnoficially launched Linkblog.io yesterday on Indie Hackers. It’s been a long road with a seemingly endless onslaught of showstoppers, but the site is up and running and it’s built with a strong architecture, and running on a stable infrastructure with the possibility to scale if necessary.

    Linkblog on Indie Hackers

    There was modest amount of hits from around the globe and I even got a comment, which was at least partially positive. After a few hours I realised that I had no way to differentiate between server-side side and client-side analytics. Oh noes!

    Linkblog seen from around the world

    So today I setup some new views and filters using custom dimensions to show each type of data. Things are looking much better now. :)

    If you’re intersted in signing up, there is a promo code on the indie hackers post, your entire first year for the price of a few cups of coffee.

  • How to get an old jekyll blog active again

    For web development enquiries feel free to contact me via email.

    It was actually pretty straight forward. Check that the git remote is still configured, install the jekyll software, follow the instructions in the error messages. I had the dev version of the site back up within a few minutes.

    $ cd $WEBSITES_DIR/blog.markjgsmith.com
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    nothing to commit, working tree clean
    $ cat .git/config | grep -A 2 remote\ \"origin\"
    [remote "origin"]
    	url = https://github.com/mjgs/mjgs.github.io.git
    	fetch = +refs/heads/*:refs/remotes/origin/*
    $ which jekyl
    $ gem install jekyll bundler
    $ bundle exec jekyll serve
    Could not find RedCloth-4.2.9 in any of the sources
    Run `bundle install` to install missing gems.
    $ bundle install
    $ bundle exec jekyll serve
    Configuration file: [WEBSITES_DIR]/blog.markjgsmith.com/_config.yml
    No post given to analyze. Try with -h
                Source: [WEBSITES_DIR]/blog.markjgsmith.com
           Destination: [WEBSITES_DIR]/blog.markjgsmith.com/_site
          Generating...
                        done.
     Auto-regeneration: enabled for '[WEBSITES_DIR]/blog.markjgsmith.com'
    Configuration file: [WEBSITES_DIR]/blog.markjgsmith.com/_config.yml
        Server address: http://0.0.0.0:4000/
      Server running... press ctrl-c to stop.

    I’m still a little fuzy on how to add posts. I tried to login to prose.io but the site wanted full access to all my repos on Github…a little excessive. Oh well editing in vim is good enough.

    Last but not least push the changes to github…

    git add *
    git commit -m "New post: How to get an old jekyll blog active again"
    git push

  • Minimal Setup for Blogging with Jekyll

    For web development enquiries feel free to contact me via email.

    This initial post is to document how to configure the base Jekyll installation so that it’s ready for blogging, with posts displaying on the main page, an archives page that lists all the posts, an about page for a personal description and social media info in the footer.

    Jekyll customized for blogging

    The actual Jekyll installation is covered in the docs. It’s pretty straight forward. Setting up free hosting with Github is covered here.

    For details of the modifications I made to the vanilla install have a look through the commits in the Github repo up to this commit.

    Jekyll new install git commits

    I’m using Prose.io to edit posts in my web browser. Prose knows about Jekyll so you can create drafts and publish posts, it’s also open source.

  • Welcome to Jekyll!

    For web development enquiries feel free to contact me via email.

    You’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated.

    To add new posts, simply add a file in the _posts directory that follows the convention YYYY-MM-DD-name-of-post.ext and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.

    Jekyll also offers powerful support for code snippets:

    def print_hi(name)
      puts "Hi, #{name}"
    end
    print_hi('Tom')
    #=> prints 'Hi, Tom' to STDOUT.

    Check out the Jekyll docs for more info on how to get the most out of Jekyll. File all bugs/feature requests at Jekyll’s GitHub repo. If you have questions, you can ask them on Jekyll’s dedicated Help repository.

subscribe via RSS