diff --git a/.dockerignore b/.dockerignore
index b97db4abb..cdd61ffc2 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,4 +1,37 @@
/.idea
/dist
/node_modules
-/data/kuma.db
+/data
+/.do
+**/.dockerignore
+**/.git
+**/.gitignore
+**/docker-compose*
+**/[Dd]ockerfile*
+LICENSE
+README.md
+.editorconfig
+.vscode
+.eslint*
+.stylelint*
+/.github
+package-lock.json
+yarn.lock
+app.json
+CODE_OF_CONDUCT.md
+CONTRIBUTING.md
+
+### .gitignore content (commented rules are duplicated)
+
+#node_modules
+.DS_Store
+#dist
+dist-ssr
+*.local
+#.idea
+
+#/data
+#!/data/.gitkeep
+#.vscode
+
+### End of .gitignore content
diff --git a/.editorconfig b/.editorconfig
index a882f5c2d..3b2721931 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -16,3 +16,6 @@ indent_size = 2
[*.yml]
indent_size = 2
+
+[*.vue]
+trim_trailing_whitespace = false
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 000000000..41ad54b81
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,73 @@
+module.exports = {
+ env: {
+ browser: true,
+ commonjs: true,
+ es2020: true,
+ node: true,
+ },
+ extends: [
+ "eslint:recommended",
+ "plugin:vue/vue3-recommended",
+ ],
+ parser: "vue-eslint-parser",
+ parserOptions: {
+ parser: "@babel/eslint-parser",
+ sourceType: "module",
+ requireConfigFile: false,
+ },
+ rules: {
+ // override/add rules settings here, such as:
+ // 'vue/no-unused-vars': 'error'
+ "no-unused-vars": "warn",
+ indent: [
+ "error",
+ 4,
+ {
+ ignoredNodes: ["TemplateLiteral"],
+ SwitchCase: 1,
+ },
+ ],
+ quotes: ["warn", "double"],
+ //semi: ['off', 'never'],
+ "vue/html-indent": ["warn", 4], // default: 2
+ "vue/max-attributes-per-line": "off",
+ "vue/singleline-html-element-content-newline": "off",
+ "vue/html-self-closing": "off",
+ "no-multi-spaces": ["error", {
+ ignoreEOLComments: true,
+ }],
+ "curly": "error",
+ "object-curly-spacing": ["error", "always"],
+ "object-curly-newline": "off",
+ "object-property-newline": "error",
+ "comma-spacing": "error",
+ "brace-style": "error",
+ "no-var": "error",
+ "key-spacing": "warn",
+ "keyword-spacing": "warn",
+ "space-infix-ops": "warn",
+ "arrow-spacing": "warn",
+ "no-trailing-spaces": "warn",
+ "no-constant-condition": ["error", {
+ "checkLoops": false,
+ }],
+ "space-before-blocks": "warn",
+ //'no-console': 'warn',
+ "no-extra-boolean-cast": "off",
+ "no-multiple-empty-lines": ["warn", {
+ "max": 1,
+ "maxBOF": 0,
+ }],
+ "lines-between-class-members": ["warn", "always", {
+ exceptAfterSingleLine: true,
+ }],
+ "no-unneeded-ternary": "error",
+ "no-else-return": ["error", {
+ "allowElseIf": false,
+ }],
+ "array-bracket-newline": ["error", "consistent"],
+ "eol-last": ["error", "always"],
+ //'prefer-template': 'error',
+ "comma-dangle": ["warn", "only-multiline"],
+ },
+}
diff --git a/.github/ISSUE_TEMPLATE/ask-for-help.md b/.github/ISSUE_TEMPLATE/ask-for-help.md
new file mode 100644
index 000000000..c3657267a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/ask-for-help.md
@@ -0,0 +1,10 @@
+---
+name: Ask for help
+about: You can ask any question related to Uptime Kuma.
+title: ''
+labels: help
+assignees: ''
+
+---
+
+
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..cea1fc16e
--- /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: bug
+assignees: ''
+
+---
+
+**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.
+
+**Desktop (please complete the following information):**
+ - Uptime Kuma Version:
+ - Using Docker?: Yes/No
+ - OS:
+ - Browser:
+
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..11fc491ef
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: enhancement
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.gitignore b/.gitignore
index 8d435974f..9caa313cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ dist-ssr
/data
!/data/.gitkeep
+.vscode
\ No newline at end of file
diff --git a/.stylelintrc b/.stylelintrc
new file mode 100644
index 000000000..4d3d9d1f8
--- /dev/null
+++ b/.stylelintrc
@@ -0,0 +1,3 @@
+{
+ "extends": "stylelint-config-recommended",
+}
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..4cbcc7bdb
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,128 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+louis@uptimekuma.louislam.net.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 000000000..b3308df09
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,104 @@
+# Project Info
+
+First of all, thank you everyone who made pull requests for Uptime Kuma, I never thought GitHub Community can be that nice! And also because of this, I also never thought other people actually read my code and edit my code. It is not structed and commented so well, lol. Sorry about that.
+
+The project was created with vite.js (vue3). Then I created a sub-directory called "server" for server part. Both frontend and backend share the same package.json.
+
+The frontend code build into "dist" directory. The server uses "dist" as root. This is how production is working.
+
+Your IDE should follow the config in ".editorconfig". The most special thing is I set it to 4 spaces indentation. I know 2 spaces indentation became a kind of standard nowadays for js, but my eyes is not so comfortable for this. In my opinion, there is no callback-hell nowadays, it is good to go back 4 spaces world again.
+
+# Project Styles
+
+I personally do not like something need to learn so much and need to config so much before you can finally start the app.
+
+For example, recently, because I am not a python expert, I spent a 2 hours to resolve all problems in order to install and use the Apprise cli. Apprise requires so many hidden requirements, I have to figure out myself how to solve the problems by Google search for my OS. That is painful. I do not want Uptime Kuma to be like this way, so:
+
+- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort to get it run
+- Single container for Docker users, no very complex docker-composer file. Just map the volume and expose the port, then good to go
+- All settings in frontend.
+- Easy to use
+
+# Tools
+- Node.js >= 14
+- Git
+- IDE that supports .editorconfig (I am using Intellji Idea)
+- A SQLite tool (I am using SQLite Expert Personal)
+
+# Prepare the dev
+
+```bash
+npm install
+```
+
+# Backend Dev
+
+```bash
+npm run start-server
+
+# Or
+
+node server/server.js
+
+```
+
+It binds to 0.0.0.0:3001 by default.
+
+
+## Backend Details
+
+It is mainly a socket.io app + express.js.
+
+express.js is just used for serving the frontend built files (index.html, .js and .css etc.)
+
+# Frontend Dev
+
+Start frontend dev server. Hot-reload enabled in this way. It binds to 0.0.0.0:3000.
+
+```bash
+npm run dev
+```
+
+PS: You can ignore those scss warnings, those warnings are from Bootstrap that I cannot fix.
+
+You can use Vue Devtool Chrome extension for debugging.
+
+After the frontend server started. It cannot connect to the websocket server even you have started the server. You need to tell the frontend that is a dev env by running this in DevTool console and refresh:
+
+```javascript
+localStorage.dev = "dev";
+```
+
+So that the frontend will try to connect websocket server in 3001.
+
+Alternately, you can specific NODE_ENV to "development".
+
+
+## Build the frontend
+
+```bash
+npm run build
+```
+
+## Frontend Details
+
+Uptime Kuma Frontend is a single page application (SPA). Most paths are handled by Vue Router.
+
+The router in "src/main.js"
+
+As you can see, most data in frontend is stored in root level, even though you changed the current router to any other pages.
+
+The data and socket logic in "src/mixins/socket.js"
+
+# Database Migration
+
+TODO
+
+# Unit Test
+
+Yes, no unit test for now. I know it is very important, but at the same time my spare time is very limited. I want to implement my ideas first. I will go back to this in some points.
+
+
+
+
+
diff --git a/README.md b/README.md
index 432ce5e12..f6bafe497 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,8 @@
# Uptime Kuma
+
+
+