<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Make All The Things Web on Andrew Smith</title>
    <link>https://www.donielsmith.com/</link>
    <description>Recent content in Make All The Things Web on Andrew Smith</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 27 Jan 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.donielsmith.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Supabase JavaScript library is not a ORM or a query builder, it&#39;s a RESTful API URL constructor</title>
      <link>https://www.donielsmith.com/blog/supabase-js-not-orm-or-query-builder/</link>
      <pubDate>Tue, 27 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/supabase-js-not-orm-or-query-builder/</guid>
      <description>&lt;p&gt;Many people think of the &lt;code&gt;@supabase/supabase-js&lt;/code&gt; library as an ORM or a query builder, but in reality, it&amp;rsquo;s neither. Instead, it provides a clean API layer for many of Supabase&amp;rsquo;s services. In this discussion, we&amp;rsquo;ll focus only on the &lt;code&gt;.from&lt;/code&gt; portion of the library, as this is where its querying capabilities live.&lt;/p&gt;&#xA;&lt;h2 id=&#34;from&#34;&gt;.from()&lt;/h2&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a common misconception that this part of the JavaScript library is an object relational mapper (ORM) or a query builder. Under the hood, however, it&amp;rsquo;s simply constructing a RESTful API URL path. That request is then sent to a server, &lt;a href=&#34;https://docs.postgrest.org/en/v14/&#34;&gt;PostgREST&lt;/a&gt; in this case, which handles query construction and executes it against your database.&lt;/p&gt;</description>
    </item>
    <item>
      <title>First things I do when setting up a Supabase project</title>
      <link>https://www.donielsmith.com/blog/first-things-i-do-when-setting-up-a-supabase-project/</link>
      <pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/first-things-i-do-when-setting-up-a-supabase-project/</guid>
      <description>&lt;p&gt;Here is a list of some things I like to do when first setting up a Supabase project.&lt;/p&gt;&#xA;&lt;h3 id=&#34;update-the-email-templates&#34;&gt;Update the Email Templates&lt;/h3&gt;&#xA;&lt;p&gt;This step is critical when working with Supabase. The &lt;code&gt;@supabase/supabase-js&lt;/code&gt; library was originally designed for single-page applications (SPAs). When building server-side rendering (SSR) applications, the library is not fully compatible by default. To address this, Supabase provides the separate &lt;code&gt;@supabase/ssr&lt;/code&gt; library. However, this library uses Proof Key for Code Exchange (PKCE) authentication by default, which does not work well with certain email-based authentication flows, such as confirmation links.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrating Supabase Storage with Payload CMS Using S3 Compatibility</title>
      <link>https://www.donielsmith.com/blog/integrating-supabase-storage-with-payload-cms-using-s3-compatibility/</link>
      <pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/integrating-supabase-storage-with-payload-cms-using-s3-compatibility/</guid>
      <description>&lt;p&gt;Supabase streamlines the process of working with file storage by offering an S3-compatible API. This compatibility enables developers to integrate Supabase Storage seamlessly with any library or tool that supports the S3 protocol, such as those designed for Amazon S3. Leveraging this feature allows you to implement robust file management without having to learn a proprietary system, making Supabase a practical and efficient choice for both new and existing applications.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Performing full text search with the Supabase Python library</title>
      <link>https://www.donielsmith.com/blog/supabase-full-text-search-in-python/</link>
      <pubDate>Tue, 23 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/supabase-full-text-search-in-python/</guid>
      <description>&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;This article assumes you are familiar with Python. It also assumes that you have read the &lt;a href=&#34;https://supabase.com/docs/guides/&#34;&gt;Supabase documentation&lt;/a&gt; and are familiar the with concept of &lt;a href=&#34;https://supabase.com/docs/guides/database/full-text-search&#34;&gt;Full Text Search&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;We will use the following tools&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://python-poetry.org/&#34;&gt;Poetry&lt;/a&gt; - we used version 1.8.2 for this article.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://supabase.com/docs/guides/cli&#34;&gt;Supabase CLI&lt;/a&gt; - we used version 1.161.0 for this article installed via npx. Alternatively you can use the &lt;a href=&#34;https://database.new/&#34;&gt;Supabase Dashboard&lt;/a&gt; if you don&amp;rsquo;t wish to setup the CLI and docker in order to use it.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;setting-up-project&#34;&gt;Setting up project&lt;/h2&gt;&#xA;&lt;p&gt;We will first create out project directory and install all the dependencies with Poetry.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Your database is the source of truth</title>
      <link>https://www.donielsmith.com/blog/your-database-is-the-source-of-truth/</link>
      <pubDate>Sat, 17 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/your-database-is-the-source-of-truth/</guid>
      <description>&lt;p&gt;There is this new trend where some developers are saying if they want to see what the database looks like when using a migration strategy then the declarative strategy is better because you can look at a single file (&lt;code&gt;schema&lt;/code&gt;) to see what the database looks like.&lt;/p&gt;&#xA;&lt;h3 id=&#34;migrations-can-contain-more-than-table-schemas&#34;&gt;Migrations can contain more than table schemas&lt;/h3&gt;&#xA;&lt;p&gt;I find the single file argument to be false because a database contains more than table schemas and most of the declarative migration tools mainly cater for database table schemas. But what about functions, views. row level security (RLS) policies and even custom enum types? these normally don&amp;rsquo;t get catered for in an easy to manage way with these declarative migration tools.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing more, procrastinate less</title>
      <link>https://www.donielsmith.com/blog/writing-more/</link>
      <pubDate>Sun, 12 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/writing-more/</guid>
      <description>&lt;p&gt;I want to write more but I keep on starting then stopping, I&amp;rsquo;m not sure why this happens. I sometimes feel like my writing isn&amp;rsquo;t that great and get put off from writing, but at times I am very passionate about a topic and can write for a good 3 - 4 hours about it.&lt;/p&gt;&#xA;&lt;p&gt;I know the on/off writing is something that happens every year for me because when I look at my blog posts on my personal website I can see a pattern. I go a few months where I am in full on writing mode, then the rest of the year is just full of no writing at all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using PowerShell to remove a directory and its content</title>
      <link>https://www.donielsmith.com/blog/2021-05-25-using-powershell-to-remove-a-directory-and-its-content/</link>
      <pubDate>Fri, 21 May 2021 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2021-05-25-using-powershell-to-remove-a-directory-and-its-content/</guid>
      <description>&lt;p&gt;As a returning user of Windows after a long time using macOS I now need to do certain tasks with a command line/terminal. On macOS, I&amp;rsquo;ve gotten used to all the commands in &lt;a href=&#34;https://iterm2.com/&#34;&gt;iTerm 2&lt;/a&gt; and have created several aliases to make certain commands easier to type.&lt;/p&gt;&#xA;&lt;p&gt;I was trying to remove a directory and all its content recently on Windows and noticed that &lt;code&gt;rm&lt;/code&gt; will only take you thus far as it doesn&amp;rsquo;t allow the removal of directories with content in it. I started looking at how this can be accomplished inside of &lt;a href=&#34;https://docs.microsoft.com/en-us/powershell/scripting/overview?view=powershell-7.1&#34;&gt;PowerShell&lt;/a&gt; and while doing so I found the &lt;code&gt;Remove-Item&lt;/code&gt; command. I dug a bit further into this command and found out it has a &lt;code&gt;-recurse&lt;/code&gt; and &lt;code&gt;-force&lt;/code&gt; parameters, these can be used to remove an entire directory and its content with it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to use dotenv with Svelte 3</title>
      <link>https://www.donielsmith.com/blog/2020-05-11-how-to-use-dotenv-with-svelte-3/</link>
      <pubDate>Mon, 11 May 2020 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2020-05-11-how-to-use-dotenv-with-svelte-3/</guid>
      <description>&lt;p&gt;I have seen this question come up numerous times in the svelte discord chat, so I have decided to write a short guide on how to get  &lt;a href=&#34;https://www.npmjs.com/package/dotenv&#34;&gt;dotenv&lt;/a&gt;  working with  &lt;a href=&#34;https://svelte.dev/&#34;&gt;Svelte 3&lt;/a&gt; . I won&amp;rsquo;t be walking through setting up Svelte 3 in this guide, but you can check out the &lt;a href=&#34;https://svelte.dev&#34;&gt;Svelte&lt;/a&gt; website for that. Before we go into how to set up dotenv, let&amp;rsquo;s talk a little about dotenv first.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-dotenv&#34;&gt;What is dotenv?&lt;/h2&gt;&#xA;&lt;p&gt;Dotenv is a node module that loads &lt;code&gt;.env&lt;/code&gt; files, which contains environment variables into node&amp;rsquo;s &lt;code&gt;process.env&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating a reusable component with Svelte 3</title>
      <link>https://www.donielsmith.com/blog/2020-04-22-creating-a-reusable-component-with-svelte-3/</link>
      <pubDate>Wed, 22 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2020-04-22-creating-a-reusable-component-with-svelte-3/</guid>
      <description>&lt;p&gt;Svelte 3 has a small API surface and allows you to create components as simple as you want. You can also create complex components with a bit more effort. Reusable components is one of the goal&amp;rsquo;s of all major frontend framework and Svelte is no stranger to this. When I talk about reusable components I mean components that you can define what action it should take and how it looks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Props vs event dispatcher with Svelte 3</title>
      <link>https://www.donielsmith.com/blog/2020-04-21-props-vs-event-dispatcher-svelte-3/</link>
      <pubDate>Tue, 21 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2020-04-21-props-vs-event-dispatcher-svelte-3/</guid>
      <description>&lt;p&gt;Depending on what other component libraries you&amp;rsquo;ve used, you may be used to handling&#xA;events by passing callback functions to component properties, or using a special event&#xA;syntax – Svelte supports both, though one is usually more appropriate than the other&#xA;depending on your situation.  This post explains both ways.&lt;/p&gt;&#xA;&lt;p&gt;This is the basic button component that we will be using for this article.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-svelte&#34; data-lang=&#34;svelte&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;on:click&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{() &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;alert&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Life has never Svelte better&amp;#39;&lt;/span&gt;)}&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;Hello World&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;button&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;the-property-prop-way&#34;&gt;The Property (prop) way&lt;/h3&gt;&#xA;&lt;p&gt;This method is widely known in the React community and its the idea of passing&#xA;the action down as a prop to the component itself. With this setup, we can&#xA;create a default action that should take place if one wasn&amp;rsquo;t passed down.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Multiple zsh configs in iTerm</title>
      <link>https://www.donielsmith.com/blog/2020-04-12-multiple-zsh-config-in-iterm/</link>
      <pubDate>Sun, 12 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2020-04-12-multiple-zsh-config-in-iterm/</guid>
      <description>&lt;h2 id=&#34;create-a-profiles-directory-inside-of-zsh&#34;&gt;Create a profiles directory inside of .zsh&lt;/h2&gt;&#xA;&lt;p&gt;Inside of your user&amp;rsquo;s directory find the &lt;strong&gt;.zsh&lt;/strong&gt; directory, &lt;code&gt;cd&lt;/code&gt; into it and create a directory called &lt;strong&gt;profiles&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This &lt;strong&gt;profiles&lt;/strong&gt; directory is where we will put our different config files for zsh.&lt;/p&gt;&#xA;&lt;script id=&#34;asciicast-1XvCM16ko4sYQi3R7mbvEsBx4&#34; src=&#34;https://asciinema.org/a/1XvCM16ko4sYQi3R7mbvEsBx4.js&#34; async&gt;&lt;/script&gt;&#xA;&#xA;&lt;h2 id=&#34;create-an-zshenv-file&#34;&gt;Create an .zshenv file&lt;/h2&gt;&#xA;&lt;p&gt;Create a &lt;code&gt;.zshenv&lt;/code&gt; file inside of your user&amp;rsquo;s directory (&lt;code&gt;/Users/~username&lt;/code&gt;) if you don&amp;rsquo;t already have one.&lt;/p&gt;&#xA;&lt;p&gt;Add a &lt;code&gt;ZSH_DIR&lt;/code&gt; path pointing to the &lt;code&gt;~/.zsh&lt;/code&gt; directory you created earlier.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Switching from Dropbox to OneDrive</title>
      <link>https://www.donielsmith.com/blog/2020-03-11-switching-from-dropbox-to-onedrive/</link>
      <pubDate>Wed, 11 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2020-03-11-switching-from-dropbox-to-onedrive/</guid>
      <description>&lt;h2 id=&#34;the-reason&#34;&gt;The Reason&lt;/h2&gt;&#xA;&lt;p&gt;Like many people, I started using &lt;a href=&#34;https://www.dropbox.com/&#34;&gt;Dropbox&lt;/a&gt; to store data in the cloud and sync data between different computers. Before getting a paid plan I invited people and got up to 5GB which was good at first. As my needs got bigger I had to upgrade to one of their paid plans in 2016. This plan cost £79.00 a year, it was called Dropbox Pro then and this changed to Dropbox Plus in 2018.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing Process</title>
      <link>https://www.donielsmith.com/blog/writing-process/</link>
      <pubDate>Sun, 08 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/writing-process/</guid>
      <description>&lt;h2 id=&#34;thinking-of-a-topic&#34;&gt;Thinking of a topic&lt;/h2&gt;&#xA;&lt;p&gt;I normally take some time to think about what I should write about, I have a few questions I normally ask myself:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;who am I writing this for future me or someone else?&lt;/li&gt;&#xA;&lt;li&gt;do I have enough knowledge on the topic?&lt;/li&gt;&#xA;&lt;li&gt;what should be the take away from this topic?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;using-a-mind-mapper-tool-to-get-my-thoughts-out&#34;&gt;Using a mind mapper tool to get my thoughts out&lt;/h2&gt;&#xA;&lt;p&gt;I then dive into my mind mapper tool of choice &lt;a href=&#34;https://writemapper.com/&#34;&gt;WriteMapper&lt;/a&gt;, as it is more built around a writers experience and it also has a really good keyboard shortcuts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to bulk delete Firebase authentication users</title>
      <link>https://www.donielsmith.com/blog/2019-12-11-how-to-bulk-delete-firebase-authentication-users/</link>
      <pubDate>Wed, 11 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2019-12-11-how-to-bulk-delete-firebase-authentication-users/</guid>
      <description>&lt;p&gt;I have been working with Firebase a lot in the last year, we make heavy use of anonymous users. I have noticed that the system generates a lot of anonymous users each time I open new browser sessions.&lt;/p&gt;&#xA;&lt;p&gt;I needed to remove some of these over time but found there was no easy way of doing so. The Firebase Authentication console allows you to remove these users one by one. But as a developer, I wanted to remove these programmatically.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Protecting routes using Regex in Amber Framework</title>
      <link>https://www.donielsmith.com/blog/2019-01-12-protecting-routes-using-regex-in-amber-framework/</link>
      <pubDate>Sat, 12 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2019-01-12-protecting-routes-using-regex-in-amber-framework/</guid>
      <description>&lt;p&gt;This felt like a better way of defining public routes as it gave more control. Adding &lt;code&gt;REGEX_PATHS&lt;/code&gt; alongside &lt;code&gt;PUBLIC_PATHS&lt;/code&gt; allowed for a more flexible and fine grained auth check.&lt;/p&gt;&#xA;&lt;p&gt;Using the following code in the &lt;code&gt;public_path&lt;/code&gt; method worked really well.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-crystal&#34; data-lang=&#34;crystal&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;public_path?&lt;/span&gt;(path)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;PUBLIC_PATHS&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;includes?(path)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;REGEX_PATHS&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;any? { &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;word&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; path &lt;span style=&#34;color:#f92672&#34;&gt;=~&lt;/span&gt; word }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We are checking if any of the &lt;code&gt;PUBLIC_PATHS&lt;/code&gt; or &lt;code&gt;REGEX_PATHS&lt;/code&gt; matches the &lt;code&gt;path&lt;/code&gt; from the &lt;code&gt;context.request&lt;/code&gt;. If there is a match this will return true and move on to the next middleware.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rendering a different template with a Controller in Amber</title>
      <link>https://www.donielsmith.com/blog/2019-01-10-rendering-a-different-template-with-a-controller-in-amber/</link>
      <pubDate>Thu, 10 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2019-01-10-rendering-a-different-template-with-a-controller-in-amber/</guid>
      <description>&lt;p&gt;In Amber if you want to render a different template with a controller not matching its name, you can just pass the path to it in the &lt;code&gt;render&lt;/code&gt; function. Paths in &lt;code&gt;render&lt;/code&gt; are by default relative to the &lt;code&gt;views&lt;/code&gt; directory, lets look at an example below to illustrate this.&lt;/p&gt;&#xA;&lt;p&gt;| HomeController&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-crystal&#34; data-lang=&#34;crystal&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;HomeController&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; ApplicationController&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    render &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index.slang&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this controller, the render method will look for &lt;code&gt;index.slang&lt;/code&gt; inside of the &lt;code&gt;views/home/&lt;/code&gt; directory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to use Google Analytics with Sapper</title>
      <link>https://www.donielsmith.com/blog/2018/05/20/how-to-use-google-analytics-with-sapper/</link>
      <pubDate>Sun, 20 May 2018 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2018/05/20/how-to-use-google-analytics-with-sapper/</guid>
      <description>&lt;p&gt;Adding Google Analytics to any website should be pretty straight forward once you have the code snippet that Google provides you with. But when you want to dynamically populate the actual tracking id it gets a bit harder, especially when using a Universal Javascript framework.&lt;/p&gt;&#xA;&lt;p&gt;For this project I decided to use &lt;a href=&#34;https://sapper.svelte.technology/&#34;&gt;Sapper&lt;/a&gt; which is an Universal JavaScript framework built on top of &lt;a href=&#34;https://svelte.technology/&#34;&gt;Svelte&lt;/a&gt;. At the time of writing the version of Sapper is &lt;strong&gt;0.12.&lt;/strong&gt; Sapper has some really nice features out of the box, it has hot module reloading, directory based routing, code splitting and offline support to name a few.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dynamic import in Sapper</title>
      <link>https://www.donielsmith.com/blog/2018/05/19/dynamic-imports-in-sapper/</link>
      <pubDate>Sat, 19 May 2018 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2018/05/19/dynamic-imports-in-sapper/</guid>
      <description>&lt;p&gt;There are times that you will need to use a library that is purely client side in &lt;a href=&#34;https://sapper.svelte.technology/&#34;&gt;Sapper&lt;/a&gt; and some of these libraries make use of client side properties that are not available on the server. i.e. document&lt;/p&gt;&#xA;&lt;p&gt;When you have hit such a case, its time to employ dynamic import. Here is an example below of how to make use of this.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;oncreate&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SomeLibrary&lt;/span&gt; } &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;some-library&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;someLib&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SomeLibrary&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;refs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;thing&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is all you would need in order to load up your library dynamically and since we are doing this in the oncreate, this will only every happen on the&#xA;client side.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating a Twitter tweet box with Svelte</title>
      <link>https://www.donielsmith.com/blog/2017/09/20/creating-a-twitter-tweet-box-with-svelte/</link>
      <pubDate>Wed, 20 Sep 2017 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2017/09/20/creating-a-twitter-tweet-box-with-svelte/</guid>
      <description>&lt;p&gt;Today I want to go about creating a Twitter tweet box with &lt;a href=&#34;https://svelte.technology&#34;&gt;Svelte&lt;/a&gt;. But before I start on this, I want to just point out some of the features that the official Twitter tweet box provides.&lt;/p&gt;&#xA;&lt;h2 id=&#34;features&#34;&gt;Features&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Character count&lt;/li&gt;&#xA;&lt;li&gt;Emoji selector&lt;/li&gt;&#xA;&lt;li&gt;Image/Video upload&lt;/li&gt;&#xA;&lt;li&gt;GIF selector&lt;/li&gt;&#xA;&lt;li&gt;Poll creator&lt;/li&gt;&#xA;&lt;li&gt;Location flag&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;We will not be attempting to build all of these features in our version, I am even inclined to say that our version like most versions you find online are not really Twitter tweet box clones. They are something completely different. So the only feature we will be adding to ours is the Character count feature, but lets look into this even more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to do web scraping with Cheerio</title>
      <link>https://www.donielsmith.com/blog/2017/08/29/how-to-do-web-scraping-with-cheerio/</link>
      <pubDate>Tue, 29 Aug 2017 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2017/08/29/how-to-do-web-scraping-with-cheerio/</guid>
      <description>&lt;p&gt;This past weekend (13 August 2017) I started on a quest to get some data from a cinema website here in Accra, Ghana. I thought this would have been easy, since the data is available publicly. I immediately opened the Chrome web inspector to see some markup like I have not seen in years.&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;&#xA;&lt;p&gt;There was no structure to this data, the listings were just a bunch of &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tags with some nested &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; tags inside. This to me was a sign of a no go, I even went on to state that there was no way of getting this data in the &lt;a href=&#34;http://slack.devcongress.org/&#34;&gt;DevCongress&lt;/a&gt; (you might be wondering what DevCongress is, more to come soon) slack group, along with a solution I wasn&amp;rsquo;t too sure would work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Svelte</title>
      <link>https://www.donielsmith.com/blog/2017/08/02/getting-started-with-svelte/</link>
      <pubDate>Wed, 02 Aug 2017 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2017/08/02/getting-started-with-svelte/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://svelte.technology/&#34;&gt;Svelte&lt;/a&gt; is not a framework like the other conventional Javascript frameworks. Svelte is an Ahead Of Time (AOT) compiler, so in the end the code that get shipped is just plain old Javascript with minimal runtime overhead. This is one of the reasons why Svelte is so fast, in some cases my entire Svelte application is smaller than the entire React library.&lt;/p&gt;&#xA;&lt;p&gt;To use Svelte, you can install its &lt;a href=&#34;https://github.com/sveltejs/svelte-cli&#34;&gt;cli tool&lt;/a&gt; or if you just want to experiment, you can make use of its online &lt;a href=&#34;https://svelte.technology/repl&#34;&gt;REPL&lt;/a&gt;. For our setup we will make use of the online REPL.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Refactoring to a service in Trails</title>
      <link>https://www.donielsmith.com/blog/2017/03/19/refactoring-to-a-service-in-trails/</link>
      <pubDate>Sun, 19 Mar 2017 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2017/03/19/refactoring-to-a-service-in-trails/</guid>
      <description>&lt;p&gt;Since I started working with &lt;a href=&#34;https://trailsjs.io/&#34;&gt;Trails&lt;/a&gt;, I have come to like its approach to a lot of things.&#xA;I feel its what I have always been looking for in a Node web framework. At the moment the&#xA;documentation is not completed but there is enough information to got you started with &lt;a href=&#34;https://trailsjs.io/&#34;&gt;Trails&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;From my last &lt;a href=&#34;https://www.donielsmith.com/blog/2017/03/10/social-auth-with-trails-using-hapijs-and-bell/&#34;&gt;post&lt;/a&gt; you can see I am trying to build something with the Instagram API, I had to&#xA;change from using the &lt;a href=&#34;https://github.com/hapijs/bell&#34;&gt;bell&lt;/a&gt; for social authentication to the actual [Instagram node library][],&#xA;the reason for this was that both were not compatible with each other (this however may be due to my&#xA;lack of experience, if you know how to get them to work together reach out to me please). When I&#xA;changed the code I started by writing the social auth in &lt;code&gt;InstagramController&lt;/code&gt;, &lt;code&gt;auth&lt;/code&gt; method.&#xA;For authentication I was following an article about &lt;a href=&#34;https://lob.com/blog/building-an-instagram-postcard-app-in-express-js/&#34;&gt;building a an instagram postcard app&lt;/a&gt; and&#xA;they suggested using &lt;a href=&#34;http://bluebirdjs.com/docs/getting-started.html&#34;&gt;Bluebird&lt;/a&gt; to convert callbacks into promises. This is what my &lt;code&gt;InstagramController&lt;/code&gt;&#xA;looked like after I was finished:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Social Auth with Trails using hapi and bell</title>
      <link>https://www.donielsmith.com/blog/2017/03/10/social-auth-with-trails-using-hapijs-and-bell/</link>
      <pubDate>Fri, 10 Mar 2017 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2017/03/10/social-auth-with-trails-using-hapijs-and-bell/</guid>
      <description>&lt;p&gt;This is my first time using &lt;a href=&#34;https://trailsjs.io/&#34;&gt;Trails&lt;/a&gt; and I decided to follow to the guides. However as I continued&#xA;I wanted to test it out on my own ideas. One of my idea was to get social login with Instagram and&#xA;get some images from Instagram based on tags.&lt;/p&gt;&#xA;&lt;p&gt;I read about &lt;a href=&#34;https://trailsjs.io/plugins&#34;&gt;Trailpack&lt;/a&gt; and thought I could just use one to deal with this, but after realising&#xA;that I had chosen &lt;a href=&#34;https://hapijs.com/&#34;&gt;hapi&lt;/a&gt; during the creation of the project, there aren&amp;rsquo;t many &lt;a href=&#34;https://trailsjs.io/plugins&#34;&gt;Trailpacks&lt;/a&gt; for&#xA;that setup. I then did a search online and found that there is a plugin for &lt;a href=&#34;https://hapijs.com/&#34;&gt;hapi&lt;/a&gt; called &lt;a href=&#34;https://github.com/hapijs/bell&#34;&gt;bell&lt;/a&gt;&#xA;which allows for social authentication. After finding this, I thought the process should be straight&#xA;forward to getting &lt;a href=&#34;https://github.com/hapijs/bell&#34;&gt;bell&lt;/a&gt; working, but due to my lack of experience with both &lt;a href=&#34;https://trailsjs.io/&#34;&gt;Trails&lt;/a&gt; and &lt;a href=&#34;https://hapijs.com/&#34;&gt;hapi&lt;/a&gt;&#xA;this didn&amp;rsquo;t seem so easy for me after all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Passing Static Attributes Down With RactiveJS</title>
      <link>https://www.donielsmith.com/blog/2016/06/05/passing-attributes-down-with-ractivejs/</link>
      <pubDate>Sun, 05 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2016/06/05/passing-attributes-down-with-ractivejs/</guid>
      <description>&lt;p&gt;I really like &lt;a href=&#34;http://www.ractivejs.org/&#34;&gt;RactiveJS&lt;/a&gt; and how the inner workings work most of the time. I recently ran into an situation where I needed a component to behave a particular way and this was a challenge at first but with the help of &lt;a href=&#34;https://twitter.com/Rich_Harris&#34;&gt;Rich Harris&lt;/a&gt; (creator of &lt;a href=&#34;http://www.ractivejs.org/&#34;&gt;RactiveJS&lt;/a&gt;) I was able to find a solution.&lt;/p&gt;&#xA;&lt;p&gt;Before jumping to my current solution I will evaluate another potential solution and explain its shortcomings.&lt;/p&gt;&#xA;&lt;p&gt;In my scenario I want to create a Ractive component and pass attributes (props or whatever you want to call them) into the actual template of the component. In this example I will do it all by manually stating the attribues I am expecting on the component template itself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>List of Slim 3 middlewares</title>
      <link>https://www.donielsmith.com/blog/2015/10/27/list-of-slim3-middlewares/</link>
      <pubDate>Tue, 27 Oct 2015 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2015/10/27/list-of-slim3-middlewares/</guid>
      <description>&lt;p&gt;Recently folks have been asking about what middlewares are available for &lt;a href=&#34;http://www.slimframework.com/docs&#34;&gt;Slim 3&lt;/a&gt;. Although &lt;a href=&#34;http://www.slimframework.com/docs&#34;&gt;Slim 3&lt;/a&gt; is still in RC stage, there have been a number of developers who have decided to create middlewares already. Here I am going to list the ones I think are beneficial to the community and to keep an eye on.&lt;/p&gt;&#xA;&lt;p&gt;Before I continue, do note that most PSR7 middlewares should work with &lt;a href=&#34;http://www.slimframework.com/docs&#34;&gt;Slim 3&lt;/a&gt;, we have intentionally not included an Interface for PSR7 middlewares in order to keep the PHP eco-system healthy. We also promote the use of PSR7 methods in middlewares and not use Slim specific methods where possible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lazy loading your controller action</title>
      <link>https://www.donielsmith.com/blog/2015/08/27/lazy-loading-controller-action/</link>
      <pubDate>Thu, 27 Aug 2015 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2015/08/27/lazy-loading-controller-action/</guid>
      <description>&lt;p&gt;In many popular frameworks these days you can lazy load your actions in order to not invoke every action unless it is the one matched that should be dispatched.&lt;/p&gt;&#xA;&lt;p&gt;We have multiple ways of doing so and in this article I will talk about a few different ways of doing this. I will be using &lt;a href=&#34;http://www.slimframework.com/docs&#34;&gt;Slim 3&lt;/a&gt; code for examples.&lt;/p&gt;&#xA;&lt;h3 id=&#34;anonymous-function&#34;&gt;Anonymous Function&lt;/h3&gt;&#xA;&lt;p&gt;This is one of the popular approaches you might take when first starting with a micro-framework like Slim. Everything is stored in the anonymous function itself for quick and dirty prototyping.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why is Slim 3 not so slim anymore</title>
      <link>https://www.donielsmith.com/blog/2015/08/01/why-is-slim3-not-so-slim-anymore/</link>
      <pubDate>Sat, 01 Aug 2015 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2015/08/01/why-is-slim3-not-so-slim-anymore/</guid>
      <description>&lt;p&gt;There is a common misconception that &lt;a href=&#34;http://www.slimframework.com/docs&#34;&gt;Slim 3&lt;/a&gt; has plenty of files and is no longer slim. &lt;a href=&#34;http://www.slimframework.com/docs&#34;&gt;Slim 3&lt;/a&gt; does indeed contain more files than &lt;a href=&#34;http://www.slimframeworks.com/&#34;&gt;Slim 2&lt;/a&gt; and this has been the result of being more flexible and moving away from the Not Invented Here (NIH) philosophy.&lt;/p&gt;&#xA;&lt;p&gt;Installing &lt;a href=&#34;http://www.slimframework.com/docs&#34;&gt;Slim 3&lt;/a&gt; through composer will install all its dependencies, when doing a PHP file count you will notice we have doubled in file count. This is a given with the amount of flexibility we now have. Most developers might not see any benefit in this as they will likely just work with what is provided, but if at any point you should hit a limitation in any working part of the framework, you can easily swap it out without a fuss.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Aura Di service aliasing</title>
      <link>https://www.donielsmith.com/blog/2015/07/30/aura-di-service-aliasing/</link>
      <pubDate>Thu, 30 Jul 2015 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2015/07/30/aura-di-service-aliasing/</guid>
      <description>&lt;p&gt;I have been working on a legacy application and wanted to remove the old process of how it lookup its services from file name and database entry to using a service locator container instead. I looked at a few DI containers and went along with &lt;a href=&#34;http://auraphp.com/packages/Aura.Di/&#34;&gt;Aura Di&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I was happy that it would allow me to work with it as a service locator as I wanted for backward compatibility in the application. In the legacy code, service names vary and look like &lt;code&gt;error.handler&lt;/code&gt;, while we want to refer to them by using &lt;a href=&#34;http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name&#34;&gt;PHP 5.5 class name resolution&lt;/a&gt; &lt;code&gt;ErrorHandler::class&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slim PHP 101 - Using Laravel config package</title>
      <link>https://www.donielsmith.com/blog/2014/04/11/slim-php-101-using-laravel-config-package/</link>
      <pubDate>Fri, 11 Apr 2014 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2014/04/11/slim-php-101-using-laravel-config-package/</guid>
      <description>&lt;p&gt;Over the past few years Laravel have become a popular full stack PHP framework and with its latest version (L4) the framework have been componentized. Now we can make use of most of Laravel components outside of the framework, the author of the framework have created packages under the name &lt;a href=&#34;https://packagist.org/search/?q=illuminate&#34;&gt;illuminate&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Today I will show you how to integrate the &lt;a href=&#34;https://packagist.org/packages/illuminate/config&#34;&gt;Config&lt;/a&gt; package into Slim and make use of it. Before we move on to that, some may ask what value will this add to &lt;a href=&#34;http://slimframework.com/&#34;&gt;Slim&lt;/a&gt; since we can already store settings inside of &lt;a href=&#34;http://slimframework.com/&#34;&gt;Slim&lt;/a&gt;. With the &lt;a href=&#34;https://packagist.org/packages/illuminate/config&#34;&gt;Config&lt;/a&gt; package we can store settings into separate files and we can also make use of the cascading folder structure for different environments.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slim PHP 101 - How to use multiple view parsers</title>
      <link>https://www.donielsmith.com/blog/2014/04/10/slim-php-101-how-to-use-multiple-view-parsers/</link>
      <pubDate>Thu, 10 Apr 2014 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2014/04/10/slim-php-101-how-to-use-multiple-view-parsers/</guid>
      <description>&lt;p&gt;In this post we will go through setting up &lt;a href=&#34;http://www.slimframework.com/&#34;&gt;Slim&lt;/a&gt; to work with multiple view parsers, for this example we will look at using &lt;a href=&#34;http://www.slimframework.com/&#34;&gt;Slim&amp;rsquo;s&lt;/a&gt; PHP view library and the &lt;a href=&#34;http://twig.sensiolabs.org/&#34;&gt;Twig&lt;/a&gt; view library. In order to use Slim with Twig we need a view parser, luckily enough there is already one created in the &lt;a href=&#34;http://github.com/codeguy/Slim-Views&#34;&gt;Slim Views&lt;/a&gt; repository.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We will be using composer to install all our dependencies.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;composer-setup&#34;&gt;Composer setup&lt;/h3&gt;&#xA;&lt;p&gt;Our composer.json file will look like below.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why no promise AngularJS 1.2.0&#43;</title>
      <link>https://www.donielsmith.com/blog/2013/11/20/why-no-promise-angularjs-1-2/</link>
      <pubDate>Wed, 20 Nov 2013 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2013/11/20/why-no-promise-angularjs-1-2/</guid>
      <description>&lt;p&gt;In the latest version of &lt;a href=&#34;http://angularjs.org&#34;&gt;AngularJS&lt;/a&gt; (1.2.0+) there seem to have been a change which will probably break most apps which have in the past relied on the view unwrapping the promise object and showing the results directly in the view.&lt;/p&gt;&#xA;&lt;p&gt;After searching online and not being able to find any fix for my issue, I resorted to &lt;a href=&#34;http://twitter.com&#34;&gt;Twitter&lt;/a&gt; as it seems like I normally get quicker results on Twitter than I do searching &lt;a href=&#34;http://www.google.com&#34;&gt;Google&lt;/a&gt; when it&amp;rsquo;s &lt;a href=&#34;http://angularjs.org&#34;&gt;AngularJS&lt;/a&gt; related.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Schema Builder with CLI Migrations</title>
      <link>https://www.donielsmith.com/blog/2013/07/23/using-schema-builder-with-cli-migrations/</link>
      <pubDate>Tue, 23 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2013/07/23/using-schema-builder-with-cli-migrations/</guid>
      <description>&lt;p&gt;The PHP Framework market landscape has changed recently with the anticipation of &lt;a href=&#34;http://laravel.com/&#34;&gt;Laravel 4&lt;/a&gt;, the most expressive PHP Framework to have come out of the techworks. The anticipation of this framework is not only due to its easy to use expressive syntax but is also due to the changes that L4 was bringing to the community.&lt;/p&gt;&#xA;&lt;p&gt;This version of the Framework has been moved to a component based approach which allows other developers in the PHP community to make use of certain aspects of the Framework outside of the Frameworks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>More is coming for MODX</title>
      <link>https://www.donielsmith.com/blog/2013/06/14/more-is-coming-for-modx/</link>
      <pubDate>Fri, 14 Jun 2013 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2013/06/14/more-is-coming-for-modx/</guid>
      <description>&lt;p&gt;Over the past few months some interesting development have been happening in the MODX community. One of those changes is the whole transition between the &lt;a href=&#34;https://siphonlabs.com/&#34;&gt;SiphonLabs&lt;/a&gt; team and the &lt;a href=&#34;http://modx.com/&#34;&gt;MODX&lt;/a&gt; team. Now that the skies have cleared of all the cloud, I am happy with the progress of both companies.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://siphonlabs.com/&#34;&gt;SiphonLabs&lt;/a&gt; will be at this year&amp;rsquo;s &lt;a href=&#34;https://siphonlabs.com/blog/2013/06/07/siphonlabs-sponsors-wordcamp-san-francisco-july-2013/&#34;&gt;Wordcamp&lt;/a&gt; go check them out.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Other changes that I am really happy about is the announcement of &lt;a href=&#34;https://www.modmore.com/&#34;&gt;modmore&lt;/a&gt;. This is a new company by community member &lt;a href=&#34;https://www.markhamstra.com/&#34;&gt;Mark Hamstra&lt;/a&gt; selling professionally developed &lt;a href=&#34;http://modx.com/&#34;&gt;MODX&lt;/a&gt; addons (extras as some call them). This has been something the MODX community have been lacking in the past and to see a viable commercial marketplace being opened is a great thing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Yet Another CMS/F Thingy called MODX</title>
      <link>https://www.donielsmith.com/blog/2013/04/01/yet-another-cms-f-thingy-called-modx/</link>
      <pubDate>Mon, 01 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2013/04/01/yet-another-cms-f-thingy-called-modx/</guid>
      <description>&lt;p&gt;Some of you might have seen my many rants on Twitter about the state of &lt;strong&gt;MODX&lt;/strong&gt;, I have grown weary&#xA;and have now decided to &lt;strong&gt;fork&lt;/strong&gt; it. I have decided to also name my &lt;strong&gt;fork&lt;/strong&gt; &amp;ldquo;MODX&amp;rdquo;, yes this is&#xA;for real, you don&amp;rsquo;t believe me. &lt;a href=&#34;http://github.com/silentworks/modx&#34;&gt;Proof right here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I have been called &lt;a href=&#34;https://twitter.com/jpdevries/status/318449404216475649&#34;&gt;fearless&lt;/a&gt;, but with the unknown of &lt;strong&gt;MODX&lt;/strong&gt; why wouldn&amp;rsquo;t I be?&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;In this post I will be talking about what my &lt;strong&gt;MODX 3&lt;/strong&gt; will bring, I will try and be as un-detailed&#xA;as possible (yes un-detailed is a word, well so I say).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build Awesome</title>
      <link>https://www.donielsmith.com/blog/2013/03/16/build-awesome/</link>
      <pubDate>Sat, 16 Mar 2013 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/blog/2013/03/16/build-awesome/</guid>
      <description>&lt;p&gt;This article is not about building the next &lt;a href=&#34;http://www.urbandictionary.com/define.php?term=rad&#34;&gt;rad&lt;/a&gt; web app, if you are after that&#xA;then you might want to go check out some of &lt;a href=&#34;http://drewwilson.com/&#34;&gt;Drew Wilson&amp;rsquo;s&lt;/a&gt; work, otherwise&#xA;continue reading.&lt;/p&gt;&#xA;&lt;p&gt;The web is full of open source projects that developers use day to day, these projects&#xA;might not always suit our needs or sometimes might not be built to our liking. There is&#xA;a continuous trend of developers/designers complaining about how horrible an open source&#xA;project is and some (including myself) take their rant onto twitter to complain. This&#xA;then starts to spread like wildfire at times and can get out of hand.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://www.donielsmith.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.donielsmith.com/about/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m &lt;strong&gt;Andrew Smith&lt;/strong&gt;, a Full Stack Developer passionate about building scalable, high-quality solutions and improving developer experiences. With experience spanning open-source contributions, product documentation, and end-to-end feature delivery, I combine technical depth with a collaborative, user-focused mindset.&lt;/p&gt;&#xA;&lt;p&gt;Over the past several years, I&amp;rsquo;ve worked across developer advocacy, cybersecurity, and e-commerce projects most recently at &lt;strong&gt;Supabase&lt;/strong&gt;, &lt;strong&gt;Spinning Fox&lt;/strong&gt;, and &lt;strong&gt;Inocan Group&lt;/strong&gt;. My work has included enhancing authentication workflows, integrating modern frameworks like &lt;a href=&#34;https://nextjs.org&#34;&gt;Next.js&lt;/a&gt; and &lt;a href=&#34;https://svelte.dev&#34;&gt;SvelteKit&lt;/a&gt;, gathering community feedback to inform product improvements, delivering core platform features under tight deadlines, and boosting application performance through smart architectural decisions.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
