From d25c30a7b2904c5dc26cf033a2e26b3a8340779c Mon Sep 17 00:00:00 2001
From: Akhil Gupta
Date: Sat, 29 May 2021 15:20:50 +0530
Subject: [PATCH] first commit
---
.github/ISSUE_TEMPLATE/bug_report.md | 34 +
.github/workflows/hub.yml | 56 +
Dockerfile | 39 +
README.md | 192 +
Shreenshots.md | 26 +
docker-compose.yml | 13 +
images/create_expense.jpg | Bin 0 -> 85401 bytes
images/create_fillup.jpg | Bin 0 -> 96578 bytes
images/screenshot.jpg | Bin 0 -> 92009 bytes
images/settings.jpg | Bin 0 -> 134058 bytes
images/users.jpg | Bin 0 -> 57612 bytes
images/vehicle_detail.jpg | Bin 0 -> 131201 bytes
images/vehicles_add.jpg | Bin 0 -> 97515 bytes
server/.env | 3 +
server/.gitignore | 21 +
server/Dockerfile | 41 +
server/common/utils.go | 89 +
server/controllers/auth.go | 179 +
server/controllers/files.go | 157 +
server/controllers/masters.go | 64 +
server/controllers/middlewares.go | 71 +
server/controllers/setup.go | 70 +
server/controllers/users.go | 22 +
server/controllers/vehicle.go | 436 +
server/db/base.go | 22 +
server/db/clarkson.go | 223 +
server/db/db.go | 58 +
server/db/dbModels.go | 192 +
server/db/dbfunctions.go | 304 +
server/db/enums.go | 111 +
server/db/migrations.go | 43 +
server/go.mod | 20 +
server/go.sum | 110 +
server/internal/sanitize/.gitignore | 22 +
server/internal/sanitize/LICENSE | 27 +
server/internal/sanitize/README.md | 62 +
server/internal/sanitize/sanitize.go | 388 +
server/main.go | 80 +
server/models/auth.go | 30 +
server/models/currency.go | 849 +
server/models/errors.go | 11 +
server/models/files.go | 5 +
server/models/misc.go | 12 +
server/models/vehicle.go | 150 +
server/service/fileService.go | 236 +
server/service/miscService.go | 30 +
server/service/userService.go | 47 +
server/service/vehicleService.go | 234 +
ui/.browserslistrc | 2 +
ui/.dockerignore | 2 +
ui/.env | 1 +
ui/.eslintignore | 2 +
ui/.eslintrc.js | 81 +
ui/.gitattributes | 44 +
ui/.gitignore | 31 +
ui/.markdownlint.yml | 17 +
ui/.postcssrc.js | 5 +
ui/.prettierignore | 3 +
ui/.prettierrc.js | 17 +
ui/.vscode/_components.code-snippets | 30 +
ui/.vscode/_sfc-blocks.code-snippets | 26 +
ui/.vscode/extensions.json | 37 +
ui/.vscode/settings.json | 93 +
ui/.vuepress/config.js | 21 +
ui/Dockerfile | 12 +
ui/README.md | 191 +
ui/aliases.config.js | 74 +
ui/babel.config.js | 4 +
ui/cypress.json | 3 +
ui/docker-compose.yml | 16 +
ui/docker-dev.dockerfile | 15 +
ui/docs/architecture.md | 93 +
ui/docs/development.md | 146 +
ui/docs/editors.md | 32 +
ui/docs/linting.md | 63 +
ui/docs/production.md | 17 +
ui/docs/routing.md | 17 +
ui/docs/state.md | 66 +
ui/docs/tech.md | 289 +
ui/docs/tests.md | 219 +
ui/docs/troubleshooting.md | 44 +
ui/generators/new/component/component.ejs.t | 31 +
ui/generators/new/component/prompt.js | 45 +
ui/generators/new/component/unit.ejs.t | 16 +
ui/generators/new/e2e/e2e.ejs.t | 6 +
ui/generators/new/e2e/prompt.js | 13 +
ui/generators/new/layout/layout.ejs.t | 18 +
ui/generators/new/layout/prompt.js | 13 +
ui/generators/new/layout/unit.ejs.t | 19 +
ui/generators/new/module/module.ejs.t | 10 +
ui/generators/new/module/prompt.js | 13 +
ui/generators/new/module/unit.ejs.t | 13 +
ui/generators/new/util/prompt.js | 13 +
ui/generators/new/util/unit.ejs.t | 14 +
ui/generators/new/util/util.ejs.t | 9 +
ui/generators/new/view/prompt.js | 18 +
ui/generators/new/view/unit.ejs.t | 13 +
ui/generators/new/view/view.ejs.t | 31 +
ui/jest.config.js | 54 +
ui/jsconfig.template.js | 15 +
ui/lint-staged.config.js | 16 +
ui/package-lock.json | 22010 ++++++++++++++++
ui/package.json | 93 +
ui/package.json.md | 75 +
ui/public/hammond.png | Bin 0 -> 463 bytes
ui/public/index.html | 16 +
ui/src/app.config.json | 4 +
ui/src/app.vue | 35 +
ui/src/assets/images/logo.png | Bin 0 -> 6849 bytes
ui/src/components/_base-button.unit.js | 13 +
ui/src/components/_base-button.vue | 5 +
ui/src/components/_base-icon.unit.js | 30 +
ui/src/components/_base-icon.vue | 47 +
ui/src/components/_base-input-text.unit.js | 45 +
ui/src/components/_base-input-text.vue | 48 +
ui/src/components/_base-link.unit.js | 139 +
ui/src/components/_base-link.vue | 81 +
ui/src/components/_globals.js | 36 +
ui/src/components/createQuickEntry.vue | 122 +
ui/src/components/nav-bar-routes.unit.js | 57 +
ui/src/components/nav-bar-routes.vue | 62 +
ui/src/components/nav-bar.unit.js | 28 +
ui/src/components/nav-bar.vue | 81 +
ui/src/components/quickEntryDisplay.vue | 68 +
ui/src/components/shareVehicle.vue | 68 +
ui/src/components/statsWidget.vue | 149 +
ui/src/design/_colors.scss | 16 +
ui/src/design/_durations.scss | 1 +
ui/src/design/_fonts.scss | 21 +
ui/src/design/_layers.scss | 6 +
ui/src/design/_sizes.scss | 19 +
ui/src/design/_typography.scss | 416 +
ui/src/design/index.scss | 22 +
ui/src/main.js | 76 +
ui/src/router/index.js | 135 +
ui/src/router/layouts/main.unit.js | 13 +
ui/src/router/layouts/main.vue | 14 +
ui/src/router/routes.js | 466 +
ui/src/router/views/_404.unit.js | 7 +
ui/src/router/views/_404.vue | 35 +
ui/src/router/views/_loading.unit.js | 7 +
ui/src/router/views/_loading.vue | 39 +
ui/src/router/views/_timeout.unit.js | 7 +
ui/src/router/views/_timeout.vue | 46 +
ui/src/router/views/createExpense.vue | 243 +
ui/src/router/views/createFillup.vue | 299 +
ui/src/router/views/createVehicle.vue | 181 +
ui/src/router/views/home.unit.js | 12 +
ui/src/router/views/home.vue | 161 +
ui/src/router/views/initialize.vue | 261 +
ui/src/router/views/login.unit.js | 79 +
ui/src/router/views/login.vue | 92 +
ui/src/router/views/profile.unit.js | 17 +
ui/src/router/views/profile.vue | 35 +
ui/src/router/views/quickEntries.vue | 111 +
ui/src/router/views/settings.vue | 207 +
ui/src/router/views/siteSettings.vue | 95 +
ui/src/router/views/users.vue | 176 +
ui/src/router/views/vehicle.vue | 411 +
ui/src/state/helpers.js | 10 +
ui/src/state/modules/auth.js | 95 +
ui/src/state/modules/auth.unit.js | 121 +
ui/src/state/modules/index.js | 81 +
ui/src/state/modules/users.js | 88 +
ui/src/state/modules/users.unit.js | 64 +
ui/src/state/modules/utils.js | 49 +
ui/src/state/modules/vehicles.js | 150 +
ui/src/state/store.js | 21 +
.../utils/dispatch-action-for-all-modules.js | 40 +
.../dispatch-action-for-all-modules.unit.js | 138 +
ui/src/utils/format-date-relative.js | 8 +
ui/src/utils/format-date-relative.unit.js | 30 +
ui/src/utils/format-date.js | 15 +
ui/src/utils/format-date.unit.js | 21 +
ui/stylelint.config.js | 50 +
ui/tests/e2e/.eslintrc.js | 6 +
ui/tests/e2e/plugins/index.js | 55 +
ui/tests/e2e/specs/auth.e2e.js | 82 +
ui/tests/e2e/specs/home.e2e.js | 7 +
ui/tests/e2e/specs/profile.e2e.js | 33 +
ui/tests/e2e/support/commands.js | 19 +
ui/tests/e2e/support/setup.js | 17 +
ui/tests/e2e/support/utils.js | 2 +
ui/tests/mock-api/index.js | 13 +
ui/tests/mock-api/resources/users.js | 42 +
ui/tests/mock-api/routes/auth.js | 33 +
ui/tests/mock-api/routes/users.js | 24 +
ui/tests/unit/__mocks__/.keep | 0
ui/tests/unit/global-setup.js | 14 +
ui/tests/unit/global-teardown.js | 7 +
ui/tests/unit/matchers.js | 105 +
ui/tests/unit/setup.js | 209 +
ui/vue.config.js | 42 +
ui/yarn.lock | 14272 ++++++++++
194 files changed, 49873 insertions(+)
create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md
create mode 100644 .github/workflows/hub.yml
create mode 100644 Dockerfile
create mode 100644 README.md
create mode 100644 Shreenshots.md
create mode 100644 docker-compose.yml
create mode 100644 images/create_expense.jpg
create mode 100644 images/create_fillup.jpg
create mode 100644 images/screenshot.jpg
create mode 100644 images/settings.jpg
create mode 100644 images/users.jpg
create mode 100644 images/vehicle_detail.jpg
create mode 100644 images/vehicles_add.jpg
create mode 100644 server/.env
create mode 100644 server/.gitignore
create mode 100644 server/Dockerfile
create mode 100644 server/common/utils.go
create mode 100644 server/controllers/auth.go
create mode 100644 server/controllers/files.go
create mode 100644 server/controllers/masters.go
create mode 100644 server/controllers/middlewares.go
create mode 100644 server/controllers/setup.go
create mode 100644 server/controllers/users.go
create mode 100644 server/controllers/vehicle.go
create mode 100644 server/db/base.go
create mode 100644 server/db/clarkson.go
create mode 100644 server/db/db.go
create mode 100644 server/db/dbModels.go
create mode 100644 server/db/dbfunctions.go
create mode 100644 server/db/enums.go
create mode 100644 server/db/migrations.go
create mode 100644 server/go.mod
create mode 100644 server/go.sum
create mode 100644 server/internal/sanitize/.gitignore
create mode 100644 server/internal/sanitize/LICENSE
create mode 100644 server/internal/sanitize/README.md
create mode 100644 server/internal/sanitize/sanitize.go
create mode 100644 server/main.go
create mode 100644 server/models/auth.go
create mode 100644 server/models/currency.go
create mode 100644 server/models/errors.go
create mode 100644 server/models/files.go
create mode 100644 server/models/misc.go
create mode 100644 server/models/vehicle.go
create mode 100644 server/service/fileService.go
create mode 100644 server/service/miscService.go
create mode 100644 server/service/userService.go
create mode 100644 server/service/vehicleService.go
create mode 100644 ui/.browserslistrc
create mode 100644 ui/.dockerignore
create mode 100644 ui/.env
create mode 100644 ui/.eslintignore
create mode 100644 ui/.eslintrc.js
create mode 100644 ui/.gitattributes
create mode 100644 ui/.gitignore
create mode 100644 ui/.markdownlint.yml
create mode 100644 ui/.postcssrc.js
create mode 100644 ui/.prettierignore
create mode 100644 ui/.prettierrc.js
create mode 100644 ui/.vscode/_components.code-snippets
create mode 100644 ui/.vscode/_sfc-blocks.code-snippets
create mode 100644 ui/.vscode/extensions.json
create mode 100644 ui/.vscode/settings.json
create mode 100644 ui/.vuepress/config.js
create mode 100644 ui/Dockerfile
create mode 100644 ui/README.md
create mode 100644 ui/aliases.config.js
create mode 100644 ui/babel.config.js
create mode 100644 ui/cypress.json
create mode 100644 ui/docker-compose.yml
create mode 100644 ui/docker-dev.dockerfile
create mode 100644 ui/docs/architecture.md
create mode 100644 ui/docs/development.md
create mode 100644 ui/docs/editors.md
create mode 100644 ui/docs/linting.md
create mode 100644 ui/docs/production.md
create mode 100644 ui/docs/routing.md
create mode 100644 ui/docs/state.md
create mode 100644 ui/docs/tech.md
create mode 100644 ui/docs/tests.md
create mode 100644 ui/docs/troubleshooting.md
create mode 100644 ui/generators/new/component/component.ejs.t
create mode 100644 ui/generators/new/component/prompt.js
create mode 100644 ui/generators/new/component/unit.ejs.t
create mode 100644 ui/generators/new/e2e/e2e.ejs.t
create mode 100644 ui/generators/new/e2e/prompt.js
create mode 100644 ui/generators/new/layout/layout.ejs.t
create mode 100644 ui/generators/new/layout/prompt.js
create mode 100644 ui/generators/new/layout/unit.ejs.t
create mode 100644 ui/generators/new/module/module.ejs.t
create mode 100644 ui/generators/new/module/prompt.js
create mode 100644 ui/generators/new/module/unit.ejs.t
create mode 100644 ui/generators/new/util/prompt.js
create mode 100644 ui/generators/new/util/unit.ejs.t
create mode 100644 ui/generators/new/util/util.ejs.t
create mode 100644 ui/generators/new/view/prompt.js
create mode 100644 ui/generators/new/view/unit.ejs.t
create mode 100644 ui/generators/new/view/view.ejs.t
create mode 100644 ui/jest.config.js
create mode 100644 ui/jsconfig.template.js
create mode 100644 ui/lint-staged.config.js
create mode 100644 ui/package-lock.json
create mode 100644 ui/package.json
create mode 100644 ui/package.json.md
create mode 100644 ui/public/hammond.png
create mode 100644 ui/public/index.html
create mode 100644 ui/src/app.config.json
create mode 100644 ui/src/app.vue
create mode 100644 ui/src/assets/images/logo.png
create mode 100644 ui/src/components/_base-button.unit.js
create mode 100644 ui/src/components/_base-button.vue
create mode 100644 ui/src/components/_base-icon.unit.js
create mode 100644 ui/src/components/_base-icon.vue
create mode 100644 ui/src/components/_base-input-text.unit.js
create mode 100644 ui/src/components/_base-input-text.vue
create mode 100644 ui/src/components/_base-link.unit.js
create mode 100644 ui/src/components/_base-link.vue
create mode 100644 ui/src/components/_globals.js
create mode 100644 ui/src/components/createQuickEntry.vue
create mode 100644 ui/src/components/nav-bar-routes.unit.js
create mode 100644 ui/src/components/nav-bar-routes.vue
create mode 100644 ui/src/components/nav-bar.unit.js
create mode 100644 ui/src/components/nav-bar.vue
create mode 100644 ui/src/components/quickEntryDisplay.vue
create mode 100644 ui/src/components/shareVehicle.vue
create mode 100644 ui/src/components/statsWidget.vue
create mode 100644 ui/src/design/_colors.scss
create mode 100644 ui/src/design/_durations.scss
create mode 100644 ui/src/design/_fonts.scss
create mode 100644 ui/src/design/_layers.scss
create mode 100644 ui/src/design/_sizes.scss
create mode 100644 ui/src/design/_typography.scss
create mode 100644 ui/src/design/index.scss
create mode 100644 ui/src/main.js
create mode 100644 ui/src/router/index.js
create mode 100644 ui/src/router/layouts/main.unit.js
create mode 100644 ui/src/router/layouts/main.vue
create mode 100644 ui/src/router/routes.js
create mode 100644 ui/src/router/views/_404.unit.js
create mode 100644 ui/src/router/views/_404.vue
create mode 100644 ui/src/router/views/_loading.unit.js
create mode 100644 ui/src/router/views/_loading.vue
create mode 100644 ui/src/router/views/_timeout.unit.js
create mode 100644 ui/src/router/views/_timeout.vue
create mode 100644 ui/src/router/views/createExpense.vue
create mode 100644 ui/src/router/views/createFillup.vue
create mode 100644 ui/src/router/views/createVehicle.vue
create mode 100644 ui/src/router/views/home.unit.js
create mode 100644 ui/src/router/views/home.vue
create mode 100644 ui/src/router/views/initialize.vue
create mode 100644 ui/src/router/views/login.unit.js
create mode 100644 ui/src/router/views/login.vue
create mode 100644 ui/src/router/views/profile.unit.js
create mode 100644 ui/src/router/views/profile.vue
create mode 100644 ui/src/router/views/quickEntries.vue
create mode 100644 ui/src/router/views/settings.vue
create mode 100644 ui/src/router/views/siteSettings.vue
create mode 100644 ui/src/router/views/users.vue
create mode 100644 ui/src/router/views/vehicle.vue
create mode 100644 ui/src/state/helpers.js
create mode 100644 ui/src/state/modules/auth.js
create mode 100644 ui/src/state/modules/auth.unit.js
create mode 100644 ui/src/state/modules/index.js
create mode 100644 ui/src/state/modules/users.js
create mode 100644 ui/src/state/modules/users.unit.js
create mode 100644 ui/src/state/modules/utils.js
create mode 100644 ui/src/state/modules/vehicles.js
create mode 100644 ui/src/state/store.js
create mode 100644 ui/src/utils/dispatch-action-for-all-modules.js
create mode 100644 ui/src/utils/dispatch-action-for-all-modules.unit.js
create mode 100644 ui/src/utils/format-date-relative.js
create mode 100644 ui/src/utils/format-date-relative.unit.js
create mode 100644 ui/src/utils/format-date.js
create mode 100644 ui/src/utils/format-date.unit.js
create mode 100644 ui/stylelint.config.js
create mode 100644 ui/tests/e2e/.eslintrc.js
create mode 100644 ui/tests/e2e/plugins/index.js
create mode 100644 ui/tests/e2e/specs/auth.e2e.js
create mode 100644 ui/tests/e2e/specs/home.e2e.js
create mode 100644 ui/tests/e2e/specs/profile.e2e.js
create mode 100644 ui/tests/e2e/support/commands.js
create mode 100644 ui/tests/e2e/support/setup.js
create mode 100644 ui/tests/e2e/support/utils.js
create mode 100644 ui/tests/mock-api/index.js
create mode 100644 ui/tests/mock-api/resources/users.js
create mode 100644 ui/tests/mock-api/routes/auth.js
create mode 100644 ui/tests/mock-api/routes/users.js
create mode 100644 ui/tests/unit/__mocks__/.keep
create mode 100644 ui/tests/unit/global-setup.js
create mode 100644 ui/tests/unit/global-teardown.js
create mode 100644 ui/tests/unit/matchers.js
create mode 100644 ui/tests/unit/setup.js
create mode 100644 ui/vue.config.js
create mode 100644 ui/yarn.lock
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..75681b2
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,34 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+*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]
+ - Have you tried using the latest docker image / code base [yes/no]
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/workflows/hub.yml b/.github/workflows/hub.yml
new file mode 100644
index 0000000..2a5ecb7
--- /dev/null
+++ b/.github/workflows/hub.yml
@@ -0,0 +1,56 @@
+name: ci
+
+on:
+ push:
+ branches: master
+
+jobs:
+ multi:
+ runs-on: ubuntu-latest
+ steps:
+ -
+ name: Checkout
+ uses: actions/checkout@v2
+ -
+ name: Set up QEMU
+ uses: docker/setup-qemu-action@v1
+ -
+ name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+ -
+ name: Set up build cache
+ uses: actions/cache@v2
+ with:
+ path: /tmp/.buildx-cache
+ key: ${{ runner.os }}-buildx-${{ github.sha }}
+ restore-keys: |
+ ${{ runner.os }}-buildx-
+ -
+ name: Login to DockerHub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+ -
+ name: Login to GitHub
+ uses: docker/login-action@v1
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.CR_PAT }}
+ -
+ name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./Dockerfile
+ #platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64
+ platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7
+ push: true
+ cache-from: type=local,src=/tmp/.buildx-cache
+ cache-to: type=local,dest=/tmp/.buildx-cache
+ tags: |
+ akhilrex/hammond:latest
+ akhilrex/hammond:1.0.0
+ ghcr.io/akhilrex/hammond:latest
+ ghcr.io/akhilrex/hammond:1.0.0
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..75c9747
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,39 @@
+ARG GO_VERSION=1.15.2
+FROM golang:${GO_VERSION}-alpine AS builder
+RUN apk update && apk add alpine-sdk git && rm -rf /var/cache/apk/*
+RUN mkdir -p /api
+WORKDIR /api
+COPY ./server/go.mod .
+COPY ./server/go.sum .
+RUN go mod download
+COPY ./server .
+RUN go build -o ./app ./main.go
+
+FROM node:latest as build-stage
+WORKDIR /app
+COPY ./ui/package*.json ./
+RUN npm install
+COPY ./ui .
+RUN npm run build
+
+
+FROM alpine:latest
+LABEL org.opencontainers.image.source="https://github.com/akhilrex/hammond"
+ENV CONFIG=/config
+ENV DATA=/assets
+ENV UID=998
+ENV PID=100
+ENV GIN_MODE=release
+VOLUME ["/config", "/assets"]
+RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
+RUN mkdir -p /config; \
+ mkdir -p /assets; \
+ mkdir -p /api
+RUN chmod 777 /config; \
+ chmod 777 /assets
+WORKDIR /api
+COPY --from=builder /api/app .
+#COPY dist ./dist
+COPY --from=build-stage /app/dist ./dist
+EXPOSE 3000
+ENTRYPOINT ["./app"]
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f9adcfc
--- /dev/null
+++ b/README.md
@@ -0,0 +1,192 @@
+[![Contributors][contributors-shield]][contributors-url] [![Forks][forks-shield]][forks-url] [![Stargazers][stars-shield]][stars-url] [![Issues][issues-shield]][issues-url] [![MIT License][license-shield]][license-url] [![LinkedIn][linkedin-shield]][linkedin-url]
+
+
+
+
+
+
+
Hammond
+ Current Version - 2021.05.07
+
+
+ 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](#about-the-project)
+ - [Motivation](#motivation)
+ - [Built With](#built-with)
+ - [Features](#features)
+- [Installation](#installation)
+- [License](#license)
+- [Roadmap](#roadmap)
+- [Contact](#contact)
+
+
+
+## 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](https://github.com/containrrr/watchtower) which will automatically update your containers whenever I release a new version or periodically rebuild the container with the latest image manually._
+
+### 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](http://github.com/akhilrex/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][product-screenshot] [More Screenshots](Screenshots.md)
+
+### Built With
+
+- [Go](https://golang.org/)
+- [Go-Gin](https://github.com/gin-gonic/gin)
+- [GORM](https://github.com/go-gorm/gorm)
+- [SQLite](https://www.sqlite.org/index.html)
+- [VueJS](https://vuejs.org/)
+- [Vuex](https://vuex.vuejs.org/)
+- [Buefy](https://buefy.org/)
+
+### 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)
+
+```sh
+ docker run -d -p 8080:8080 --name=hammond akhilrex/hammond
+```
+
+Binding local volumes to the container
+
+```sh
+ docker run -d -p 8080:8080 --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](https://github.com/akhilrex/hammond/blob/master/docker-compose.yml) to update the volume and port binding and run the following command
+
+```yaml
+version: '2.1'
+services:
+ hammond:
+ image: akhilrex/hammond
+ container_name: hammond
+ volumes:
+ - /path/to/config:/config
+ - /path/to/data:/assets
+ ports:
+ - 8080:8080
+ restart: unless-stopped
+```
+
+```sh
+ docker-compose up -d
+```
+
+
+
+### Environment Variables
+
+| Name | Description | Default |
+| ---- | -------------------------------------------------------------------------------------------------------------------------- | ------- |
+| 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:pass@tcp(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](https://twitter.com/akhilrex)
+
+Project Link: [https://github.com/akhilrex/hammond](https://github.com/akhilrex/hammond)
+
+
+
+
+
+
+[contributors-shield]: https://img.shields.io/github/contributors/akhilrex/hammond.svg?style=flat-square
+[contributors-url]: https://github.com/akhilrex/hammond/graphs/contributors
+[forks-shield]: https://img.shields.io/github/forks/akhilrex/hammond.svg?style=flat-square
+[forks-url]: https://github.com/akhilrex/hammond/network/members
+[stars-shield]: https://img.shields.io/github/stars/akhilrex/hammond.svg?style=flat-square
+[stars-url]: https://github.com/akhilrex/hammond/stargazers
+[issues-shield]: https://img.shields.io/github/issues/akhilrex/hammond.svg?style=flat-square
+[issues-url]: https://github.com/akhilrex/hammond/issues
+[license-shield]: https://img.shields.io/github/license/akhilrex/hammond.svg?style=flat-square
+[license-url]: https://github.com/akhilrex/hammond/blob/master/LICENSE.txt
+[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555
+[linkedin-url]: https://linkedin.com/in/akhilrex
+[product-screenshot]: images/screenshot.jpg
diff --git a/Shreenshots.md b/Shreenshots.md
new file mode 100644
index 0000000..0bdb21d
--- /dev/null
+++ b/Shreenshots.md
@@ -0,0 +1,26 @@
+## Home Page / Summary
+
+![Product Name Screen Shot][product-screenshot]
+
+## Add Podcast
+
+
+
+## All Episodes Chronologically
+
+
+
+## Podcast Episodes
+
+
+
+
+## Player
+
+
+
+## Settings
+
+
+
+[product-screenshot]: images/screenshot.jpg
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..c029931
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,13 @@
+version: "2.1"
+services:
+ hammond:
+ image: akhilrex/hammond
+ container_name: hammond
+ environment:
+ - CHECK_FREQUENCY=240
+ volumes:
+ - /path/to/config:/config
+ - /path/to/data:/assets
+ ports:
+ - 8080:8080
+ restart: unless-stopped
diff --git a/images/create_expense.jpg b/images/create_expense.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0320468a4373b483dc4576a4d14ba109b057bbf0
GIT binary patch
literal 85401
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