<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web Development on</title><link>/categories/web-development/</link><description>Recent content in Web Development on</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 20 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="/categories/web-development/index.xml" rel="self" type="application/rss+xml"/><item><title>Setting up Ollama server with Open WebUI</title><link>/2025/12/setting-up-ollama-with-open-webui/</link><pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate><guid>/2025/12/setting-up-ollama-with-open-webui/</guid><description>&lt;p>Ollama is a powerful AI model serving platform that makes it easy to run large language models locally. In this post, we&amp;rsquo;ll walk through setting up Ollama with Open WebUI in a Docker containerized environment, including GPU acceleration support. Visit &lt;a href="https://ollama.com/" target="_blank" rel="noopener noreffer ">Ollama&amp;rsquo;s website&lt;/a> for more information.&lt;/p>
&lt;h2 id="what-is-ollama">What is Ollama?&lt;/h2>
&lt;p>Ollama is an AI platform that provides an easy way to run large language models locally. It offers:&lt;/p>
&lt;ul>
&lt;li>Easy model management&lt;/li>
&lt;li>GPU acceleration support&lt;/li>
&lt;li>A clean API for model interactions&lt;/li>
&lt;li>Containerized deployment&lt;/li>
&lt;/ul>
&lt;h2 id="what-is-open-webui">What is Open WebUI?&lt;/h2>
&lt;p>Open WebUI provides a web-based interface for interacting with Ollama models, making it easy to use AI models without needing to write code or deal with complex command-line interfaces. Visit the &lt;a href="https://github.com/open-webui/open-webui" target="_blank" rel="noopener noreffer ">Open WebUI GitHub repository&lt;/a> for more information.&lt;/p></description></item><item><title>Running Dex With Docker Compose</title><link>/2024/07/running-dex-with-docker-compose/</link><pubDate>Wed, 10 Jul 2024 00:00:00 +0000</pubDate><guid>/2024/07/running-dex-with-docker-compose/</guid><description>&lt;p>I previously wrote on how to run Dex using docker. In this article, I will create nearly the same setup using docker-compose. This will allow you to run, stop, and restart the setup from a central location.&lt;/p>
&lt;!-- more -->
&lt;h2 id="setting-up-the-docker-compose-file">Setting up the docker-compose file&lt;/h2>
&lt;p>You&amp;rsquo;ll want to make sure that you have the same Dex config file from the previous article but with one small change. The &lt;code>issuer&lt;/code> field should be changed to &lt;code>http://dex:5556/dex&lt;/code> to match the service name that will be used in the docker-compose file. If the &lt;code>issuer&lt;/code> field is not changed, the example app will try to find Dex within the container it is running in and will not be able to reach it. Changing it to &lt;code>http://dex:5556/dex&lt;/code> will allow the example app to reach Dex through the network that docker-compose creates.&lt;/p></description></item><item><title>Running Dex with Docker</title><link>/2024/07/running-dex-with-docker/</link><pubDate>Fri, 05 Jul 2024 00:00:00 +0000</pubDate><guid>/2024/07/running-dex-with-docker/</guid><description>&lt;p>Dex is a tool created to make setting up and managing authentication methods easy. It is a single sign-on and identity management tool that can be used to authenticate users against a variety of backends. It is a great tool to use when you want to add authentication to your application without having to worry about managing the users yourself but still gives you the option if you want to. This post will show you how to run Dex locally to decide if it is the right tool for you. This does not cover how to integrate Dex into your application or integration with other authentication providers but I will cover that in a future article.&lt;/p></description></item><item><title>Setting Up archer t6e on ubuntu server</title><link>/2023/01/setting-up-archer-t6e-on-ubuntu-server/</link><pubDate>Mon, 09 Jan 2023 00:00:00 +0000</pubDate><guid>/2023/01/setting-up-archer-t6e-on-ubuntu-server/</guid><description>&lt;h2 id="installing-the-driver">Installing the driver&lt;/h2>
&lt;div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
 &lt;div class="code-header language-bash">
 &lt;span class="code-title">&lt;i class="arrow fas fa-angle-right" aria-hidden="true">&lt;/i>&lt;/span>
 &lt;span class="ellipses">&lt;i class="fas fa-ellipsis-h" aria-hidden="true">&lt;/i>&lt;/span>
 &lt;span class="copy" title="Copy to clipboard">&lt;i class="far fa-copy" aria-hidden="true">&lt;/i>&lt;/span>
 &lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install broadcom-sta-dkms&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;h2 id="configuring-the-connection">Configuring the connection&lt;/h2>
&lt;p>Open &lt;code>/etc/netplan/00-installer-config-wifi.yaml&lt;/code> and make sure it has something like the following:&lt;/p>
&lt;div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
 &lt;div class="code-header language-">
 &lt;span class="code-title">&lt;i class="arrow fas fa-angle-right" aria-hidden="true">&lt;/i>&lt;/span>
 &lt;span class="ellipses">&lt;i class="fas fa-ellipsis-h" aria-hidden="true">&lt;/i>&lt;/span>
 &lt;span class="copy" title="Copy to clipboard">&lt;i class="far fa-copy" aria-hidden="true">&lt;/i>&lt;/span>
 &lt;/div>&lt;pre tabindex="0">&lt;code># This is the network config written by &amp;#39;subiquity&amp;#39;
network:
 version: 2
 wifis:
 wlp6s0: # The network found with `ls /sys/class/net`
 access-points:
 {SSID}: # SSID
 password: {Password} # Password
 dhcp4: true&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Close the file and run&lt;/p></description></item><item><title>Setting up a proxy with NGINX</title><link>/2022/02/setting-up-a-proxy-with-nginx/</link><pubDate>Tue, 15 Feb 2022 00:00:00 +0000</pubDate><guid>/2022/02/setting-up-a-proxy-with-nginx/</guid><description>&lt;h1 id="what-is-a-proxy">What is a proxy?&lt;/h1>
&lt;p>In its simplest form, a proxy is a server that listens for requests and redirects them to other servers. This allows multiple servers to run on the same system but still receive their requests, such as the case with many large hosting servers today. Requests are redirected depending on how they were made to the machine such as the URL that was used.&lt;/p>
&lt;p>Proxies can also provide other benefits such as distributing traffic among multiple instances of the same web server, formatting the requests such as adding additional headers, filtering requests, or adding an additional security layer.&lt;/p></description></item><item><title>System monitoring with the TICK stack</title><link>/2022/02/system-monitoring-with-the-tick-stack/</link><pubDate>Tue, 15 Feb 2022 00:00:00 +0000</pubDate><guid>/2022/02/system-monitoring-with-the-tick-stack/</guid><description>&lt;h1 id="time-series-database">Time series database&lt;/h1>
&lt;p>A time series database is a type of database that is optimized for storing data based on time stamped data. This method of storing data is useful in situations where values need to be monitored for change over time. While any database could be used to store this information, time series databases are time stamp aware which leading to improved organization and query speeds.&lt;/p>
&lt;p>Time series databases have come up more in recent times due to the increase in the number of internet connected devices. Sensors can now be found throughout households, cities, and businesses. The measurements from these devices is usually precise with a frequent sample rate. A time series database is also able to aggregate this data so that large amounts of data can be removed by still keeping a summary of the samples.&lt;/p></description></item><item><title>Creating a local DNS with CoreDNS</title><link>/2022/02/creating-a-local-dns-with-coredns/</link><pubDate>Sat, 12 Feb 2022 00:00:00 +0000</pubDate><guid>/2022/02/creating-a-local-dns-with-coredns/</guid><description>&lt;h1 id="what-is-a-domain-name-system">What is a Domain Name System?&lt;/h1>
&lt;p>A Domain Name System (DNS) acts like the the phone book of the internet. When we enter a URL in our browser, it sends the URL to a DNS server to look up the actual IP address. Many times a DNS server will not know the IP address of the URL and it will have to forward it on to additional DNS servers. The next server to ask is determined by reading the URL from right to left. Each section of the URL is referred to as a zone and the remainder of the URL is forwarded on to the next zone.&lt;/p></description></item><item><title>Create an LXC container on Proxmox</title><link>/2019/11/create-an-lxc-container-on-proxmox/</link><pubDate>Thu, 21 Nov 2019 00:00:00 +0000</pubDate><guid>/2019/11/create-an-lxc-container-on-proxmox/</guid><description>&lt;p>Proxmox uses LXC containers rather than the more commonly heard of Docker containers. LXC containers can be thought of as very lightweight virtual machines. LXC containers can be customized to run an application but typically their images are for linux operating systems.&lt;/p>
&lt;h1 id="adding-a-template">Adding a template&lt;/h1>
&lt;p>There are two methods for adding an LXC container template to Proxmox. The first is very convenient but requires Proxmox to be connected to the internet. The second is not as convenient but still easy enough and can be done if you are not connecting your server to the public internet.&lt;/p></description></item><item><title>Create a Windows 10 VM on Proxmox</title><link>/2019/11/create-windows-vm-on-proxmox/</link><pubDate>Tue, 19 Nov 2019 00:00:00 +0000</pubDate><guid>/2019/11/create-windows-vm-on-proxmox/</guid><description>&lt;p>Using the Proxmox server I set up to run a Windows virtual machine would let me move away from dual booting on my main machine. I boot into Windows maybe twice a year so there won&amp;rsquo;t be much that I miss. A remote connection from my desktop (or another machine) will more than cover my occasional use case for Windows.&lt;/p>
&lt;p>Creating a virtual machine in Proxmox is straightforward for anyone who has worked with virtual machines before. There are, however, a few changes that are needed to make it easier to work with the VM on a remote system.&lt;/p></description></item><item><title>Installing Proxmox</title><link>/2019/11/installing-proxmox/</link><pubDate>Tue, 19 Nov 2019 00:00:00 +0000</pubDate><guid>/2019/11/installing-proxmox/</guid><description>&lt;p>Proxmox is an operating system that makes it easy to manage virtual machines and LXC containers. The server uses a web GUI for easy access and handles all of the resource management from within the GUI.&lt;/p>
&lt;p>For the most part, installing Proxmox is as straightforward as installing any OS. I ran into some issues with the networking and screen configurations that took me a little time to troubleshoot. Both were easily fixed by making sure the correct hardware was plugged into my system before starting to install.&lt;/p></description></item><item><title>How to write a URL shortener in Go</title><link>/2019/08/how-to-write-a-url-shortener-in-go/</link><pubDate>Thu, 01 Aug 2019 00:00:00 +0000</pubDate><guid>/2019/08/how-to-write-a-url-shortener-in-go/</guid><description>&lt;p>Exercise 2 of &lt;a href="https://gophercises.com/" target="_blank" rel="noopener noreffer ">Gophercises&lt;/a> was to create a URL shortener. The framework for this code was given and the student needed to fill in the missing pieces. The solution of the main problem is given but no solutions are given for the bonus challenges. This is my solution to the main problem along with the bonus challenges in which a solution was not given.&lt;/p>
&lt;p>The main goal of this exercise was to get familiar working with different markup languages in Go. It also introduced working with command line arguments and reading data from a database.&lt;/p></description></item><item><title>Using Goth in Gin</title><link>/2019/07/using-goth-in-gin/</link><pubDate>Thu, 18 Jul 2019 00:00:00 +0000</pubDate><guid>/2019/07/using-goth-in-gin/</guid><description>&lt;p>After learning about the new Go language, I immediately wanted to try creating something with it. I started a web app and learned about the Gin framework. While the router in the Go standard library is nice, Gin adds a few nice to haves and as well as a performance boost.&lt;/p>
&lt;p>When I started adding a user system to the app, I knew I wanted users to be able to sign in with OAuth. The process is too convenient from a user’s perspective not to. I found the Goth library which makes using OAuth very easy and supports a very large number of providers.&lt;/p></description></item><item><title>Running Repetier Server on RPI3 with Balena OS</title><link>/2018/12/running-repetier-server-on-rpi3-with-balena-os/</link><pubDate>Sun, 02 Dec 2018 00:00:00 +0000</pubDate><guid>/2018/12/running-repetier-server-on-rpi3-with-balena-os/</guid><description>&lt;p>Not too long ago I purchased a Mostly Printed CNC from V1Engineering. I’ve been taking my time putting it together (and still have some cleaning up to do) but I finally got it to a usable state a couple weeks ago. It’s awesome to be able to watch it move completely on its own and make sounds resembling alien space crafts for the 1980’s Galaga arcade game. It’s even more awesome to think about all the different projects it will be useful for.&lt;/p></description></item><item><title>Figuring Out Vuepress Plugins</title><link>/2018/11/figuring-out-vuepress-plugins/</link><pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate><guid>/2018/11/figuring-out-vuepress-plugins/</guid><description>&lt;p>Vuepress is an up and coming static site generator based on the Vue.js framework. Plugin support was added in version 1.x and there are already a number of functional plugins. Many of these plugins are still lacking in documentation and required troubleshooting to get them working correctly. Example repos were created for a number of the plugins and shared back with the Vuepress community.&lt;/p>
&lt;!-- more -->
&lt;h2 id="the-blog-plugin">The blog Plugin&lt;/h2>
&lt;p>The blog plugin makes it easy to sort and filter the different posts according to their tag and category frontmatter. Tag and Category variables are created containing information from all of the posts containing that tag or category. A custom component can then be created to use this information and render it on the page. The example project can be found below.&lt;/p></description></item><item><title>Adding Netlify CMS to your VuePress website</title><link>/2018/11/adding-netlify-cms-to-your-vuepress-website/</link><pubDate>Tue, 06 Nov 2018 00:00:00 +0000</pubDate><guid>/2018/11/adding-netlify-cms-to-your-vuepress-website/</guid><description>&lt;p>Another great feature of Netlify is there Content Management System. This allows you to edit your website’s posts without the need of a git account, from anywhere through the website’s admin page, and with more than the typical text editor. Using Netlify’s CMS is currently not a few button click process but it is still very straight forward. These are the steps needed to get Netlify’s CMS running on your jpgage.&lt;/p></description></item><item><title>Getting started with VuePress</title><link>/2018/11/getting-started-with-vuepress/</link><pubDate>Fri, 02 Nov 2018 00:00:00 +0000</pubDate><guid>/2018/11/getting-started-with-vuepress/</guid><description>&lt;p>Ever since I started looking at web development, I’ve had a thing for static site generators. They are a great way to get a simple website up and running. I’ve used many of the currently available generators: Jekyll, Hugo, Hexo. I’m always trying to learn the different features and why one is better than the other.&lt;/p>
&lt;!-- more -->
&lt;p>A new player has entered the SSG scene, VuePress. VuePress is built using the up and coming javascript framework Vue.js. This allows you to use all of the features of Vue.js while creating your static website. Tie that with an extremely easy setup and you’ve got a simple and powerful website generator.&lt;/p></description></item><item><title>Hosting with Netlify</title><link>/2018/09/hosting-with-netlify/</link><pubDate>Thu, 06 Sep 2018 00:00:00 +0000</pubDate><guid>/2018/09/hosting-with-netlify/</guid><description>&lt;p>I love GitLab pages. Being able to host a simple website with the same service I use for code makes managing services a lot more convenient. Of course with everything we use there are always alternatives. This post talks about a static site hosting alternative called Netlify.&lt;/p>
&lt;!-- more -->
&lt;h2 id="hosting-with-netlify">Hosting with Netlify&lt;/h2>
&lt;p>Netlify offers many of the same features as GitHub pages but, since static site hosting is their primary service, they throw in a few added features. A couple of these features are the ability to do form submissions and compatibility with all static site generators. A complete comparison of features can be found here: &lt;a href="https://www.netlify.com/github-pages-vs-netlify/" target="_blank" rel="noopener noreffer ">https://www.netlify.com/github-pages-vs-netlify/&lt;/a>.&lt;/p></description></item><item><title>Hosting on GitLab Pages</title><link>/2018/09/hosting-on-gitlab-pages/</link><pubDate>Wed, 05 Sep 2018 00:00:00 +0000</pubDate><guid>/2018/09/hosting-on-gitlab-pages/</guid><description>&lt;p>I love using GitLab for all of my source control needs. You can imagine how happy I was to discover that the same service could be used to create a simple website for a project portfolio. Here is the short process needed to get your own static website up and running.&lt;/p>
&lt;!-- more -->
&lt;h2 id="setting-up-your-gitlab-repository">Setting up your GitLab repository&lt;/h2>
&lt;p>The first step to host a website from a git repository is to of course create the repository. If you do no have a custom domain name, then you can name the repository based on your user name to have a nicer URL than your typical repository will allow. For example, the repository for my nwneisen gitlab user would be:&lt;/p></description></item><item><title>Creating a Hugo website</title><link>/2018/08/creating-a-hugo-website/</link><pubDate>Mon, 27 Aug 2018 00:00:00 +0000</pubDate><guid>/2018/08/creating-a-hugo-website/</guid><description>&lt;p>When my sister first asked me for help with her website, I didn&amp;rsquo;t have much to say. I was going to school for embedded engineering and web development was a completely different beast. I looked through her server at the code but I could tell most of it was generated using tools in which I hadn&amp;rsquo;t used anything remotely similar. I wasn&amp;rsquo;t much able to help much but I got an idea of the issue she was running into with her site: speed, nonresponsive, and expensive.&lt;/p></description></item><item><title>Yumz</title><link>/2017/05/yumz/</link><pubDate>Mon, 01 May 2017 00:00:00 +0000</pubDate><guid>/2017/05/yumz/</guid><description>&lt;p>A web app I&amp;rsquo;ve been working on to create a new way to decide where to eat with friends. It&amp;rsquo;s kind of like tinder but for food.&lt;/p>
&lt;!-- more -->
&lt;h3 id="what-is-it">What is it?&lt;/h3>
&lt;p>Yumz is an idea I had to make it easier to decide where to eat with friends. How often have you been with friends, throwing out restaurant ideas, only to have them shot down by one person or another. Yumz is here to fix that.&lt;/p></description></item><item><title>HMI Sensor Network</title><link>/2016/04/hmi-sensor-network/</link><pubDate>Thu, 28 Apr 2016 00:00:00 +0000</pubDate><guid>/2016/04/hmi-sensor-network/</guid><description>&lt;p>Measure and report environment data using XBEE nodes and a browser based graphical user interface.&lt;/p>
&lt;!-- more -->
&lt;h3 id="the-nodes">The nodes&lt;/h3>
&lt;p>This project was my senior design project for my last year of school at South Dakota School of Mines &amp;amp; Technology. My partner and I created shield boards for XBEE wireless modules. These shields made it easy to attach sensors for temperature, lighting, and humidity along with an indicator LED. The XBEE network used a self healing mesh network which made it easy to add new nodes or compensate for a missing node. The node&amp;rsquo;s signal needed to go through brick walls and so pro modules were the ideal candidates. Basic XBEE modules were also used in the network due to their availability.&lt;/p></description></item></channel></rss>