Hammond is a self hosted vehicle management system to track fuel and other expenses related to all of your vehicles.

Overview

Contributors Forks Stargazers Issues MIT License LinkedIn


Hammond

Current Version - 2021.06.08

A self-hosted vehicle expense tracking system with support for multiple users.
Explore the docs »

Report Bug · Request Feature · Screenshots

Table of Contents

About The Project

Hammond is a self hosted vehicle management system to track fuel and other expenses related to all of your vehicles. It supports multiple users sharing multiple vehicles. It is the logical successor to Clarkson which has not been updated for quite some time now.

Developers Note: This project is under active development which means I release new updates very frequently. It is recommended that you use something like watchtower which will automatically update your containers whenever I release a new version or periodically rebuild the container with the latest image manually.

Also check out my other self-hosted, open-source solution - Podgrab - Podcast download and archive manager and player.

Motivation and Developer Notes

I was looking for a fuel tracking system and stumbled upon Clarkson. Although it did most of what I needed it has not been updated for quite a lot of time. Since I had some bandwidth available as my previous open source project Podgrab had become quite stable now, my first thought was to contribute to the Clarkson project only. I soon realized that the architecture that Clarkson had used was not really be that extensible now and would warrant a complete rewrite only. So I decided to build Hammond - The successor to Clarkson.

The current version of Hammond is written using GO for backend and Vuejs for the front end. Originally I had thought of using the same tech stack for both frontend and the backend so that it became easier for users and other developers to use, deploy and contribute. Which is why the first version of Hammond has a NestJS backend complete with all the bells and whistles (GraphQL, Prisma and what nots). But I eventually decided to rebuild the backend in GO just to keep the container size small. No matter how much you can optimize the sheer size of the node_modules will always add bulk to your containers. I host all my tools on my Raspberry Pi. It only makes sense to keep the container size as small as possible.

Also I had initially thought of a 2 container approach (1 for backend and 1 for the frontend) so that they can be independently maintained and updated. I eventually decided against this idea for the sake of simplicity. Although it is safe to assume that most self-hosters are fairly tech capable it still is much better to have a single container that you can fire and forget.

Product Name Screen Shot More Screenshots

Built With

Features

  • Migrate data from Clarkson
  • Add/Manage multiple vehicles
  • Add/Manage multiple users
  • Track fuel and other expenses
  • Share vehicles across multiple users
  • Save attachment against vehicles
  • Quick Entries (take a photo of a receipt or pump screen to make entry later)
  • Vehicle level and overall reporting

Installation

The easiest way to run Hammond is to run it as a docker container.

Using Docker

Simple setup without mounted volumes (for testing and evaluation)

  docker run -d -p 3000:3000 --name=hammond akhilrex/hammond

Binding local volumes to the container

   docker run -d -p 3000:3000 --name=hammond -v "/host/path/to/assets:/assets" -v "/host/path/to/config:/config"  akhilrex/hammond

Using Docker-Compose

Modify the docker compose file provided here to update the volume and port binding and run the following command

version: '2.1'
services:
  hammond:
    image: akhilrex/hammond
    container_name: hammond
    volumes:
      - /path/to/config:/config
      - /path/to/data:/assets
    ports:
      - 3000:3000
    restart: unless-stopped
   docker-compose up -d

Build from Source / Ubuntu Installation

Although personally I feel that using the docker container is the best way of using and enjoying something like hammond, a lot of people in the community are still not comfortable with using Docker and wanted to host it natively on their Linux servers. Follow the link below to get a guide on how to build hammond from source.

Build from source / Ubuntu Guide

Environment Variables

Name Description Default
JWT_SECRET The secret used to sign the JWT token. There is a default value but it is important that you change it to something else A super strong secret that needs to be changed
PORT Change the internal port of the application. If you change this you might have to change your docker configuration as well (empty)

Setup

When you open Hammond for the first time after a fresh install, you will be presented with the option to either import data from an existing Clarkson instance or setup a fresh instance.

Migration from Clarkson

You will have to ensure that the Clarkson database is accessible from the Hammond deployment. In case it is not directly possible, you can always take a backup of the Clarkson database and host it somewhere accessible to Hammond using a temporary container. If the access problem is sorted, you will have to enter the connection string the Clarkson database in the following format.

        user:[email protected](127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local

You can check the connectivity from the screen as well.

Note: All the users migrated from Clarkson will have their passwords changed to hammond

Fresh setup

You will have to provide your name, email and password so that an admin user can be created for you.

Once done you will be taken to the login page.

Go through the settings page once and change relevant settings before you start adding vehicles and expenses.

License

Distributed under the GPL-3.0 License. See LICENSE for more information.

Roadmap

  • More reports
  • Vehicle specific reminders (servicing etc)
  • Native installer for Windows/Linux/MacOS

Contact

Akhil Gupta - @akhilrex

Project Link: https://github.com/akhilrex/hammond

Buy Me A Coffee

Comments
  • Import data (Fuelly)

    Import data (Fuelly)

    Fuelly currently supports exporting data as a CSV, would it be possible to have an import functionality? I would love to transition to using this instead of Fuelly.

    enhancement 
    opened by tiemonl 13
  • 422 error when logging in

    422 error when logging in

    Before creating a bug report please make sure you are using the latest docker image / code base.

    Please complete the following information

    • Installation Type: [Docker]
    • Have you tried using the latest docker image / code base [yes]

    Describe the bug When logging in, it results in a 422 error and I cant log in.

    To Reproduce Steps to reproduce the behavior:

    1. Go to login page
    2. Enter credentials
    3. Click on log in

    Expected behavior That I can log in

    Screenshots image

    Error from the console: hammond | [GIN] 2021/06/05 - 08:00:00 | 422 | 375.955µs | -myIp- | POST "/api/login"

    Additional context Is there a way to reset the password from the commandline?

    opened by leon1995 11
  • Help for using with NGINX

    Help for using with NGINX

    • Installation Type: Docker
    • Have you tried using the latest docker image / code base yes

    Describe the bug Hi All, I'd like some help to use a reverse proxy to expose these container to an https://xxx:8123/cars url/path how have to fill location section of NGINX? Thanks.

    opened by michelebossa 10
  • Stats sum is wrong, if

    Stats sum is wrong, if "This Year" is selected

    Please complete the following information

    • Installation Type: Docker
    • Have you tried using the latest docker image / code base yes

    Describe the bug I have only one Vehicle in Hammond with only 5 fillups in 2022. The stats are wrong if I select "This Year". "Past 3 Months" and "All Time" are correct. See the screenshots

    Expected behavior If "This Year" is selected, the first fillup (Jan 25, 2022, 78,93 €) is missing in the sum and should be included.

    Screenshots Stats_ThisYear_wrong Stats_Past3Month_correct Stats_AllTime_correct Fillups

    opened by heikok88 8
  • Add icon for mobile homescreens

    Add icon for mobile homescreens

    Related to #31. Made a quick and dirty icon for home screens on mobile devices. Also, don't be fooled by the apple-touch-icon, it works for Android as well (see discussion here).

    Here is the icon for reference: touch-icon

    opened by AlfHou 5
  • Support disabling user authentication

    Support disabling user authentication

    I run all of my self-hosted containers behind a reverse proxy with my own authentication. It becomes extra steps if I have to log in through my OAUTH as well as the Hammond authentication.

    Cool project, can't wait to see where it goes!

    opened by beauwest 5
  • [BUG] Cant Upload a large file

    [BUG] Cant Upload a large file

    Before creating a bug report please make sure you are using the latest docker image / code base.

    Please complete the following information

    • Installation Type: Docker
    • Have you tried using the latest docker image / code base: Latest Docker Image

    Describe the bug I am unable to upload the attached file to Hammond. It fails will the following error in chrome logs

    Chrome Logs:

    POST http://192.168.0.11:8991/api/vehicles/4e398eb1-922e-4898-ae54-613bf9db8e86/attachments net::ERR_CONNECTION_RESET
    

    Docker Container Logs

    today at 11:05:20 PM[GIN] 2022/05/20 - 17:35:20 | 200 |    1.133269ms |    192.168.0.23 | GET      "/api/vehicles/4e398eb1-922e-4898-ae54-613bf9db8e86/mileage?since=2022-04-20T17:35:22.595Z"
    today at 11:05:22 PM[GIN] 2022/05/20 - 17:35:22 | 200 |      324.72µs |      172.18.0.1 | GET      "/"
    

    Expected behavior The file should get uploaded.

    Skoda Octavia A8 Manual.pdf

    opened by mokshmridul 4
  • After importing form Clarkson, you cannot change imported accounts' passwords

    After importing form Clarkson, you cannot change imported accounts' passwords

    Before creating a bug report please make sure you are using the latest docker image / code base.

    Please complete the following information

    • Installation Type: [Docker/Native] Docker
    • Have you tried using the latest docker image / code base [yes/no] Yes

    Describe the bug After importing from Clarkson, attempting to change an imported account's password from the default ("hammond"), to anything else will result in Request failed with status code: 422

    To Reproduce Steps to reproduce the behavior:

    1. Import an account from Clarkson
    2. Log into the account with the default password: "hammond"
    3. Attempt to change the password

    Expected behavior The password is changed

    Additional context The web request error: {"errors":{"OldPassword":"{min: 8}"}}

    opened by mrkirby153 4
  • Default Currency at initialization doesn't save

    Default Currency at initialization doesn't save

    Before creating a bug report please make sure you are using the latest docker image / code base.

    Please complete the following information

    • Installation Type: Docker
    • Have you tried using the latest docker image / code base - yes

    Describe the bug During the initial account creation steps, the website asks for a default currency and distance measurement. I select USD and Miles. After logging in, the currency is set to "INR" and the distance is set to "Km". Even after going to Admin -> Site Settings, and updating the default currency/distance there, INR/Km is still the site default.

    If the User Currency/Distance settings are changed, then the website displays information correctly.

    Expected behavior Setting site wide defaults should be saved.

    Additional context Add any other context about the problem here.

    opened by mochman 3
  • Allow for 3 decimals in both fill and price quantity

    Allow for 3 decimals in both fill and price quantity

    I would like to request the ability to use 3 (or maybe more?) decimals in both fill and price quantity, as usually both quantity and price uses more decimals at gas stations.

    hammondticket (Small)

    opened by salguero51 3
  • Cant Remove a Vehicle/Easy to Create Duplicates

    Cant Remove a Vehicle/Easy to Create Duplicates

    Before creating a bug report please make sure you are using the latest docker image / code base.

    Please complete the following information

    • Installation Type: [Docker]
    • Have you tried using the latest docker image / code base [yes]

    Describe the bug When one creates a new vehicle, it's possible to press the submit button twice, creating duplicate entries - there's no obvious way to delete it. To Reproduce Steps to reproduce the behavior: Create vehicle Click submit twice Cant delete duplicate entry

    Expected behavior Clicking submit should immediately redirect/grey out button Vehicles should be deleteable

    Screenshots If applicable, add screenshots to help explain your problem.

    Additional context Add any other context about the problem here.

    opened by jonootto 3
  • Hammond and nginx reverse proxy

    Hammond and nginx reverse proxy

    Hello I tried to reverse proxy hammond but I have a white page instead of the login page.

    location ^~ /hammond {
         proxy_pass http://localhost:3333;
         }
    

    Am i missing something ?

    opened by redfirebrooks 0
  • Feature Request: GasBuddy import

    Feature Request: GasBuddy import

    GasBuddy offers a fuel log tied to transactions from GasBuddy's WEX payment card. GasBuddy's log exports as a CSV with many of the same fields that hammond relies on.

    Because GasBuddy provides integration with the fuel purchase through Wex, it is convenient to collect fuel log data through GasBuddy. It would be really great to be able to import this in batches to Hammond!

    Column Headers:

    • Date (UTC): YYYY-MM-DD HH:MM:SS
    • Location: string, human-friendly name
    • Station Link: string, url
    • Address: string, street address
    • City: string, municipality
    • State: string, 2 char state abbreviation
    • Country: string, 2 char country abbreviation
    • Total Cost: number, up to 2 decimal points
    • Currency: string, 3 digit abreviation (USD)
    • Fuel Type: string, (e.g. Regular, Midgrade, Diesel)
    • Quantity: number, up to 3 decimal points
    • Unit: string, (e.g. gallons)
    • Vehicle: vehicle nickname
    • Unit price: number, currency per quantity unit
    • Odometer: number, mileage
    • Fuel Economy: string: number (calcualted fuel economy, OR 'missingPrevious', 'noFillPrevious')
    • Fuel Economy Unit: string, abbreviation (e.
    • Fillup: string, YES or NO (complete fill)

    ExampleGasBuddyExport.csv g., MPG)

    This looks like it would only require small modificatinos from the Fuelly import function, as well as a new view.

    func GasBuddyImport(content []byte, userId string) []string {
    	stream := bytes.New(content)
    	reader := csv.NewReader(stream)
    	records, err := reader.ReadAll()
    
    	var errors []string
    	if err != nil {
    		errors = append(errors, err.Error())
    		return errors
    	}
    
    	vehicles, err := GetUserVehicles(userId)
    	if err != nil {
    		errors = append(errors, err.Error())
    		return errors
    	}
    	user, err := GetUserById(userId)
    
    	if err != nil {
    		errors = append(errors, err.Error())
    		return errors
    	}
    
    	var vehicleMap map[string]db.Vehicle = make(map[string]db.Vehicle)
    	for _, vehicle := range *vehicles {
    		vehicleMap[vehicle.Nickname] = vehicle
    	}
    
    	var fillups []db.Fillup
    	var expenses []db.Expense
    	# layout YYYY-MM-DD HH:MM:SS
    	layout := "2006-01-02 15:04:05"
    
    	for index, record := range records {
    		if index == 0 {
    			continue
    		}
    
    		var vehicle db.Vehicle
    		var ok bool
    		// vehicle appears in the 13th column
    		if vehicle, ok = vehicleMap[record[12]]; !ok {
    			errors = append(errors, "Found an unmapped vehicle entry at row "+strconv.Itoa(index+1))
    		}
    		// date appears in column 1, no alt layout
    		dateStr := record[0]
    		date, err := time.Parse(layout, dateStr)
    		if err != nil {
    			errors = append(errors, "Found an invalid date/time at row "+strconv.Itoa(index+1))
    		}
    		// total cost appears in column 8; Currency can be pulled from column 9
    		totalCostStr := record[7]
    		totalCost64, err := strconv.ParseFloat(totalCostStr, 32)
    		if err != nil {
    			errors = append(errors, "Found an invalid total cost at row "+strconv.Itoa(index+1))
    		}
    
    		totalCost := float32(totalCost64)
    		// odometer reading is in column 15; not sure what user.Currency does here. odometer reading is simply presented as a number
    		odoStr := record[14]
    		odoreading, err := strconv.Atoi(odoStr)
    		if err != nil {
    			errors = append(errors, "Found an invalid odo reading at row "+strconv.Itoa(index+1))
    		}
    		// location could be pulled from a short name (e.g. CITGO) from column 2 or a long name.
    		
    		location := record[1] + " at " + record[2] + ", " + record[3] + ", " + record[4] + ", " + record[5]
    
    		//Create Fillup: only fuel records, no service records
    		// unit price in column 14; not sure what user.Currency does here.
    		rateStr := record[13]
    		ratet64, err := strconv.ParseFloat(rateStr, 32)
    		if err != nil {
    			errors = append(errors, "Found an invalid cost per gallon at row "+strconv.Itoa(index+1))
    		}
    		rate := float32(ratet64)
    		//quantity is in column 11
    		quantity64, err := strconv.ParseFloat(record[10], 32)
    		if err != nil {
    			errors = append(errors, "Found an invalid quantity at row "+strconv.Itoa(index+1))
    		}
    		quantity := float32(quantity64)
    		//pull station link as notes, from column 3
    		notes := record[2]
    		
    		//fillup in column 18
    		isTankFull := record[17] == "Yes"
    		
    		fal := false
    		//this entry does not include Fuel Type (record[9]), which could map to Hammond's Fuel Subtype. However, this would not capture differences in Diesel (e.g., in NorthEast US, we can get higher grade Diesel sourced from New Brunswick - all listed under "diesel" in gasbuddy).
    		fillups = append(fillups, db.Fillup{
    			VehicleID:       vehicle.ID,
    			FuelUnit:        vehicle.FuelUnit, //this could be pulled from record[11]
    			FuelQuantity:    quantity,
    			PerUnitPrice:    rate,
    			TotalAmount:     totalCost,
    			OdoReading:      odoreading,
    			IsTankFull:      &isTankFull,
    			Comments:        notes,
    			FillingStation:  location,
    			HasMissedFillup: &fal,
    			UserID:          userId,
    			Date:            date,
    			Currency:        user.Currency, //this could be pulled from record[8] 
    			DistanceUnit:    user.DistanceUnit, //odometer units must be mapped correctly between fuely profile and gasbuddy profile
    			Source:          "GasBuddy",
    		})
    
    	}
    	if len(errors) != 0 {
    		return errors
    	}
    
    	tx := db.DB.Begin()
    	defer func() {
    		if r := recover(); r != nil {
    			tx.Rollback()
    		}
    	}()
    	if err := tx.Error; err != nil {
    		errors = append(errors, err.Error())
    		return errors
    	}
    	if err := tx.Create(&fillups).Error; err != nil {
    		tx.Rollback()
    		errors = append(errors, err.Error())
    		return errors
    	}
    	if err := tx.Create(&expenses).Error; err != nil {
    		tx.Rollback()
    		errors = append(errors, err.Error())
    		return errors
    	}
    	err = tx.Commit().Error
    	if err != nil {
    		errors = append(errors, err.Error())
    	}
    	return errors
    }
    
    

    I would imagine that similar instructions would apply to gasbuddy.

          <div class="column">
            <p class="subtitle"> Steps to import data from GasBuddy</p>
            <ol>
              <li
                >Export your data from GasBuddy in the CSV format. Steps to do that can be found
                <a href="https://help.gasbuddy.com/hc/en-us/articles/9224647595543-Export-Fuel-Logs">here</a>.</li
              >
              <li>Make sure that you have already created the vehicles in Hammond platform.</li>
              <li>Make sure that the Vehicle nickname in Hammond is exactly the same as the name on GasBuddy CSV (Check Vehicle column) or the import will not work.</li>
              <li
                >Make sure that the <u>Currency</u> and <u>Distance Unit</u> are set correctly in Hammond. Import will not autodetect Currency from the
                CSV but use the one set for the user.</li>
              <li>Similiarly, make sure that the <u>Fuel Unit</u> and <u>Fuel Type</u> are correctly set in the Vehicle.</li>
              <li>Once you have checked all these points,just import the CSV below.</li>
              <li><b>Make sure that you do not import the file again and that will create repeat entries.</b></li>
            </ol>
          </div>
    

    GasBuddy has the appropriate currency and fuel unit data if #103 is implemented.

    I am not familiar with Go, but I will try to test this in a fork to see if I can get it working.

    opened by camden-bock 2
  • Fuelly import error 422

    Fuelly import error 422

    Using latest docker, trying to import fuelly csv, I get an "There was some issue with importing the file. Please check the error message" message. Format matches the 2 examples I was given. Only detail in the logs is:

    [GIN] 2022/09/04 - 18:12:07 | 422 | 2.899524ms | 192.168.26.101 | POST "/api/import/fuelly"

    Is there somewhere to get more data on the actual error? I tried modifying the example files to use the name of my created vehicle, and that failed as well. Just not sure where to look to find what the problem is.

    opened by Vilhjalmr26 2
  • Quick entry error 500

    Quick entry error 500

    Please complete the following information

    • Installation Type: [Docker]
    • Have you tried using the latest docker image / code base [yes]

    Describe the bug The quick entry returns an error 500, when uploading a photo.

    To Reproduce Steps to reproduce the behavior:

    1. Go to the homescreen
    2. Select Photo
    3. Upload File
    4. See error

    Expected behavior A quick entry gets added

    Logs

    [GIN] 2022/08/30 - 12:52:25 | 500 |   12.813694ms |       10.0.1.27 | POST     "/api/quickEntries"
    2022/08/30 12:52:25 [Recovery] 2022/08/30 - 12:52:25 panic recovered:
    interface conversion: error is url.EscapeError, not validator.ValidationErrors
    /usr/local/go/src/runtime/iface.go:261 (0x412d2b)
    /usr/local/go/src/runtime/iface.go:271 (0x412c8f)
    /api/common/utils.go:61 (0x9b413b)
    /api/controllers/files.go:30 (0x9d7b14)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:165 (0x9b20f9)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/recovery.go:99 (0x9b20e0)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:165 (0x9ea0ab)
    /api/main.go:68 (0x9ea08d)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:165 (0x9b20f9)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/recovery.go:99 (0x9b20e0)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:165 (0x9b11d3)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/logger.go:241 (0x9b1192)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:165 (0x9a7989)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/gin.go:489 (0x9a796f)
    /go/pkg/mod/github.com/gin-gonic/[email protected]/gin.go:445 (0x9a745b)
    /usr/local/go/src/net/http/server.go:2887 (0x6b5b22)
    /usr/local/go/src/net/http/server.go:1952 (0x6b0f4c)
    /usr/local/go/src/runtime/asm_amd64.s:1371 (0x473e60)
    

    Additional context This is a fresh installation on docker with the following compose file:

    version: '2.1'
    services:
      hammond:
        image: akhilrex/hammond
        container_name: hammond
        volumes:
          - /data/hammond/config:/config
          - /data/hammond/data:/assets
        ports:
          - 8083:3000
        restart: unless-stopped
    
    opened by janleskovec 3
Owner
Akhil Gupta
Akhil Gupta
An inventory service for managing farming vehicles, equipment, and resources

Inventory ?? An inventory service for managing farming vehicles, equipment, and resources. What is this? A REST API for managing farm inventory via HT

Britton Hayes 3 Apr 29, 2022
Vehicle Rating System in Go

Vehicle Rating System Build a console application that will gather feedback from a JSON file and generate a rating of vehicles, and map each rating as

Mikako Shirai 0 Nov 3, 2021
Real-time Map displays real-time positions of public transport vehicles in Helsinki

Real-time Map Real-time Map displays real-time positions of public transport vehicles in Helsinki. It's a showcase for Proto.Actor - an ultra-fast dis

ASYNKRON 32 Nov 30, 2022
Self-hosted video-hosting website and video archival manager for Niconico, Bilibili, and Youtube

Self-hosted video-hosting website and video archival manager for Niconico, Bilibili, and Youtube

null 793 Jan 1, 2023
Remark42 is a self-hosted, lightweight, and simple comment engine

Remark42 is a self-hosted, lightweight, and simple (yet functional) comment engine, which doesn't spy on users. It can be embedded into blogs, articles or any other place where readers add comments.

Umputun 4.1k Dec 28, 2022
listmonk is a standalone high performance, self-hosted newsletter and mailing list manager with a modern dashboard. Single binary app.

listmonk is a standalone, self-hosted, newsletter and mailing list manager. It is fast, feature-rich, and packed into a single binary. It uses a PostgreSQL database as its data store.

Kailash Nadh 9.2k Jan 1, 2023
Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana.

Focalboard Like what you see? ?? Give us a GitHub Star! ⭐ Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana. It helps

Mattermost 14k Jan 9, 2023
listmonk is a standalone, self-hosted, newsletter and mailing list manager

listmonk is a standalone, self-hosted, newsletter and mailing list manager. It is fast, feature-rich, and packed into a single binary. It uses a Postg

Super-Smile 16 Aug 15, 2022
Mouthful is a self-hosted alternative to Disqus.

Mouthful is a lightweight commenting server written in GO and Preact. It's a self hosted alternative

Viktoras 743 Dec 20, 2022
longurl is a self-hosted short url service.

longurl Introduction longurl is a self-hosted short url service. Try It Out curl -H "Content-Type:application/json" -X POST --data '{"url": "https://g

long2ice 44 Oct 24, 2022
🖖🏻 A self-hosted Quora like web application written in Go

Guora ???? A self-hosted Quora like web application written in Go 基于 Golang 类似知乎的私有部署问答应用 包含问答、评论、点赞、管理后台等功能 Quick Start (Docker Deploy) $ docker-comp

meloalright 618 Dec 27, 2022
A self-hosted golang application that listens for Terraform pull request events via webhooks.

Atlantis Terraform Pull Request Automation Resources What is Atlantis? What does it do? Why should you use it? Stargazers over time Resources How to g

null 0 Dec 9, 2021
Gazer system is used to track data.

Gazer System - 凝视系统 这是一个用于长期追踪数据变化的工具。 我们常需要定时针对某些链接进行爬取,以获取历史数据,这个系统为此而生。这是一组无状态的服务,意味着它可以简单地水平扩展。它提供了如下几个功能: 自动代理:使用洋葱路由进行代理,无需自行维护 IP 池,也可以绕过大多数基于

Jannchie 9 Nov 24, 2022
A little bit of magic for keeping track of the things you have to do.

Be productive. To-do lists are supposed to help you get things done. And I suppose looking through all the stuff you still have to do each time you wa

Adam Lloyd 20 Jun 1, 2022
Blackjack on Exercism's Go Track

Blackjack Welcome to Blackjack on Exercism's Go Track. If you need help running the tests or submitting your code, check out HELP.md. If you get stuck

null 0 Dec 6, 2021
This is my solution the React exercise on Exercism's Go track.

Solution to React Exercise on Exercism This is my solution the React exercise on Exercism's Go track. The original readme is below. React Welcome to R

Michael 0 Feb 8, 2022
Everything a semantic desktop search engine combined with a single-user document management system

Everything will be a semantic desktop search engine combined with a single-user document management system. It will apply ideas of the semantic web and knowledge graphs to organize your data, allowing you to maintain private knowledge graphs as well as make use of public knowledge graphs, such as Wikidata.

Dominik Honnef 22 May 21, 2022
New GF (Go Frame) based back office management system

GFast-V2 平台简介 基于全新GF(Go Frame)的后台管理系统 前端采用ruoyi-ui 、Vue、Element UI。 阿里云优惠券:点我进入,腾讯云优惠券:点我领取 本项目由奇讯科技团队开发。 特征 高生产率:几分钟即可搭建一个后台管理系统 模块化:单应用多系统的模式,将一个完整的

Mr.Qin 5 Dec 31, 2022
This is my personal website, hosted on GitHub Pages

astrophena.name This is my personal website, hosted on GitHub Pages. Serving locally You need the latest Go and Node.js installed.

Ilya Mateyko 2 Nov 16, 2022