# Golang Site Template ## What this project isn't - A library - A framework ## What is this project? - A template, a starting point. An inspiration, maybe? This project is a demo, of sorts, really. It is the base for my next side project, which you can find at [markbailey.dev](https://markbailey.dev). This project is a culmination of many, many hours poring over Go documentation, others' Go code, and questions I wanted answers to, left over from previous experimentation with a popular web framework for Go. This project is a full stack application. This is a template for a full stack web application written in Golang. It is fully-featured, and includes a number of tools to bootstrap a project on top of what is already here. This project is a work in progress, it will be updated and maintained for the foreseeable future. This is a labor of love, learning, and a desire to build software that intrigues me outside of my day-to-day work. I chose Go for this project because I wanted to explore the language, and the concepts it lends itself well to. You will notice that this project contains a number of features and patterns found in large scale projects. This is intentional, as in my day-to-day work I write fullstack PHP in the Symfony framework. I wanted to mirror the patterns I use at work in this project, and it has proven to be a huge boost in my understanding of both Go and the patterns, tools, and paradigms I use at work. Much of this project has been influenced by the advice of my incredible mentor, friend, and boss Andy, and my guru level senior developer. I have accumulated here the best practices that I have learned from them, from my own experience, and from the tenacious push in the Go community to write clean, idiomatic, and readable code. It contains these features and more: - Middleware (Fully customizable, custom) - Routing and sub-routing - In-memory sessions - Templating - Database interaction This one is special, because the project uses an SQLite3 database for local development, and a PostgreSQL database for production. - Password authentication - Project management via the `bin/app` script This site is currently powering my personal site, which is self hosted on a VPS. One of my favorite features of this project is the low number of dependencies. Check out the following excerpt from `go.mod` (As of 2024-11-11). ```go require ( github.com/a-h/templ v0.2.793 github.com/golang-jwt/jwt/v5 v5.2.1 github.com/lib/pq v1.10.9 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.27.0 ) ``` There are only seven dependencies in this project, two of them being just database drivers. There are also the "hidden" dependencies of sqlc, and TailwindCSS. I like to think there are actually only five, if we don't count the obligatory database drivers. ## Project Statistics ![project statistics](./project-files/11092024-ptpp-stats.png) ## Setup 1. Install Go - Arch: `sudo pacman -S go` - Other OS: from your package manager or visit [https://go.dev/doc/install](https://go.dev/doc/install) 2. Select a useable IDE: - GoLand (JetBrains) - Neovim - Install `gopls` LSP using Mason and enable it in your `lspconfig` - Set up formatting with `gofumpt` and `goimports` - VSCode - I don't use it, and I wouldn't recommend it. But you do you, boo :) 3. Clone project: `git clone https://git.markbailey.dev/cerbervs/ptpp.git` 4. Run: `make first-install` 5. Access the development site at [http://localhost:8080](http://localhost:8080) or access the live site at ## Project Management Through `bin/app` `bin/app` is a script that manages the project from top to bottom. Please consult the help menu for more information: `bin/app help` When starting from a fresh clone of the project, run `bin/app first-install` to set up the project. This will install several binaries, and the required node packages. You may be required to enter your password. ## Git Conventions ### Making Branches Branches should be prefixed with one of the following - `feat/` - `fix/` - `refactor/` - `test/` Followed by a short description of the proposed changeset `separated-by-hyphens` ### Committing Code This project uses [Conventional Commits (Angular)](https://www.conventionalcommits.org/en/v1.0.0/#specification), and in the future, [Commitlint](https://github.com/conventional-changelog/commitlint)