diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..ad526a1
--- /dev/null
+++ b/.github/CODE_OF_CONDUCT.md
@@ -0,0 +1,130 @@
+# 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 any ways @5ouma
+have. 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](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](https://www.contributor-covenant.org/translations).
+
+[https://www.contributor-covenant.org/faq]: https://www.contributor-covenant.org/faq
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 0000000..3821d26
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,42 @@
+# Contributing Guide
+
+> [!NOTE]
+> You must follow the [Code of Conduct](./CODE_OF_CONDUCT.md).
+
+I happily welcome your contributions! Before you contribute, I would recommend
+reading this guideline for a better development experience.
+
+
+
+- [๐ฌ Commit Message](#-commit-message)
+- [โ Pull Requests Title](#-pull-requests-title)
+- [๐ชต Commit Log](#-commit-log)
+
+
+
+## ๐ฌ Commit Message
+
+I recommend you to follow [Conventional Commits] with this format.
+
+```commit message
+type(scope): Description
+
+Body
+```
+
+[Conventional Commits]: https://www.conventionalcommits.org
+
+
+
+## โ Pull Requests Title
+
+You don't need to add any prefixes like `feature` or `bug fix` to the Pull
+Requests title. I can recognize what kind of PR it is from labels. Please give a
+clear title.
+
+
+
+## ๐ชต Commit Log
+
+I do squash merge to the main branch to keep the commit history clean. When
+merging your Pull Request, I'll add the Conventional Commits type and scope.
diff --git a/.github/ISSUE_TEMPLATE/1-feature-request.yml b/.github/ISSUE_TEMPLATE/1-feature-request.yml
new file mode 100644
index 0000000..307930e
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/1-feature-request.yml
@@ -0,0 +1,33 @@
+name: ๐ Feature Request
+description: Request a new feature or enhancement to an existing feature
+labels: [๐ New Feature]
+body:
+ - type: textarea
+ id: feature-description
+ attributes:
+ label: โ๏ธ Describe the feature
+ description: A clear and concise description
+ placeholder: |
+ - I want a feature to...
+ - This behavior should be...
+ validations:
+ required: true
+
+ - type: checkboxes
+ id: checks
+ attributes:
+ label: โ๏ธ Confirm these checks
+ description: Make sure you reviewed below
+ options:
+ - label: I searched the GitHub [Issues](https://github.com/5ouma/mobicard/issues) or [Discussions](https://github.com/5ouma/mobicard/discussions).
+ required: true
+ - label: I tried with the latest version.
+ required: false
+ - label: I agree to follow the [Code of Conduct](https://github.com/5ouma/mobicard/blob/main/.github/CODE_OF_CONDUCT.md).
+ required: true
+
+ - type: textarea
+ id: additional-info
+ attributes:
+ label: ๐๏ธ Additional Information
+ description: Anything else you want to add
diff --git a/.github/ISSUE_TEMPLATE/2-bug-report.yml b/.github/ISSUE_TEMPLATE/2-bug-report.yml
new file mode 100644
index 0000000..959f6b5
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2-bug-report.yml
@@ -0,0 +1,38 @@
+name: ๐งฐ Bug Report
+description: Something doesn't work
+labels: [๐งฐ Bug]
+body:
+ - type: textarea
+ id: bug-description
+ attributes:
+ label: โ๏ธ Describe the Bug
+ description: A clear and concise description
+ validations:
+ required: true
+
+ - type: textarea
+ id: reproduction-steps
+ attributes:
+ label: ๐ญ How to Reproduce the Bug
+ description: Steps to reproduce the behavior
+ validations:
+ required: true
+
+ - type: checkboxes
+ id: checks
+ attributes:
+ label: โ๏ธ Confirm these checks
+ description: Make sure you reviewed below
+ options:
+ - label: I searched the GitHub [Issues](https://github.com/5ouma/mobicard/issues) or [Discussions](https://github.com/5ouma/mobicard/discussions).
+ required: true
+ - label: I tried with the latest version.
+ required: false
+ - label: I agree to follow the [Code of Conduct](https://github.com/5ouma/mobicard/blob/main/.github/CODE_OF_CONDUCT.md).
+ required: true
+
+ - type: textarea
+ id: additional-info
+ attributes:
+ label: ๐๏ธ Additional Information
+ description: Anything else you want to add
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..89fc1db
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,9 @@
+blank_issues_enabled: false
+contact_links:
+ - name: ๐ฌ General Discussions
+ url: https://github.com/5ouma/mobicard/discussions/new?category=general
+ about: Chat about anything and everything here
+
+ - name: ๐ Q&A
+ url: https://github.com/5ouma/mobicard/discussions/new?category=q-a
+ about: Ask the community for help
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..0e7544c
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,34 @@
+
+
+### โ ๏ธ Issue
+
+close #
+
+
+
+### โ๏ธ Description
+
+
+
+
+
+### ๐ Type of the Change
+
+- [ ] ๐ New Feature
+- [ ] ๐งฐ Bug
+- [ ] ๐ก๏ธ Security
+- [ ] ๐ Documentation
+- [ ] ๐๏ธ Performance
+- [ ] ๐งน Refactoring
+- [ ] ๐งช Testing
+- [ ] ๐ง Maintenance
+- [ ] ๐ฝ CI
+- [ ] ๐ง Meta
+
+
+
+- [ ] I agree to follow the [Code of Conduct](https://github.com/5ouma/mobicard/blob/main/.github/CODE_OF_CONDUCT.md).
diff --git a/.github/SECURITY.md b/.github/SECURITY.md
new file mode 100644
index 0000000..a0e70fa
--- /dev/null
+++ b/.github/SECURITY.md
@@ -0,0 +1,9 @@
+# Security Policy
+
+## ๐ก๏ธ Reporting a Vulnerability
+
+If you find any issues of security, please report on
+[Security Advisories](https://github.com/5ouma/mobicard/security/advisories/new).
+
+> [!CAUTION]
+> Please do NOT open Issues.
diff --git a/.github/actions/setup-bun-with-cache/action.yml b/.github/actions/setup-bun-with-cache/action.yml
new file mode 100644
index 0000000..f2f9aae
--- /dev/null
+++ b/.github/actions/setup-bun-with-cache/action.yml
@@ -0,0 +1,20 @@
+name: ๐ Setup Bun with Cache
+description: Install Bun and cache project dependencies
+
+runs:
+ using: composite
+
+ steps:
+ - name: ๐ Setup Bun
+ uses: oven-sh/setup-bun@4bc047ad259df6fc24a6c9b0f9a0cb08cf17fbe5 # v2.0.1
+
+ - name: ๐ซ Cache node_modules
+ uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2
+ with:
+ path: ./node_modules
+ key: ${{ runner.os }}-bun-${{ hashFiles('./bun.lockb') }}
+ restore-keys: ${{ runner.os }}-bun-
+
+ - name: ๐ฆ Install Dependencies
+ run: bun install
+ shell: bash
diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml
new file mode 100644
index 0000000..4590200
--- /dev/null
+++ b/.github/auto_assign.yml
@@ -0,0 +1,3 @@
+addReviewers: true
+addAssignees: author
+reviewers: [5ouma]
diff --git a/.github/pr-labeler.yml b/.github/pr-labeler.yml
new file mode 100644
index 0000000..219094b
--- /dev/null
+++ b/.github/pr-labeler.yml
@@ -0,0 +1,27 @@
+alwaysReplace: true
+
+customLabels:
+ - text: "- [x] ๐ New Feature"
+ label: ๐ New Feature
+ - text: "- [x] ๐งฐ Bug"
+ label: ๐งฐ Bug
+ - text: "- [x] ๐ก๏ธ Security"
+ label: ๐ก๏ธ Security
+ - text: "- [x] ๐ Documentation"
+ label: ๐ Documentation
+ - text: "- [x] ๐๏ธ Performance"
+ label: ๐๏ธ Performance
+ - text: "- [x] ๐งน Refactoring"
+ label: ๐งน Refactoring
+ - text: "- [x] ๐งช Testing"
+ label: ๐งช Testing
+ - text: "- [x] ๐ง Maintenance"
+ label: ๐ง Maintenance
+ - text: "- [x] ๐ฝ CI"
+ label: ๐ฝ CI
+ - text: "- [x] ๐ง Meta"
+ label: ๐ง Meta
+ - text: "chore(deps): "
+ label: โ๏ธ Dependencies
+ - text: "Release: v"
+ label: ๐ Release
diff --git a/.github/release.yml b/.github/release.yml
new file mode 100644
index 0000000..6ab54dc
--- /dev/null
+++ b/.github/release.yml
@@ -0,0 +1,31 @@
+changelog:
+ exclude:
+ labels:
+ - ๐ง Meta
+ - ๐ Release
+
+ categories:
+ - title: ๐งจ Breaking Changes
+ labels: [๐งจ Breaking Change]
+ - title: ๐ New Features
+ labels: [๐ New Feature]
+ - title: ๐งฐ Bug Fixes
+ labels: [๐งฐ Bug]
+ - title: ๐ก๏ธ Security Fixes
+ labels: [๐ก๏ธ Security]
+ - title: ๐ Documentation Changes
+ labels: [๐ Documentation]
+ - title: ๐๏ธ Performance Improvements
+ labels: [๐๏ธ Performance]
+ - title: ๐งน Refactoring
+ labels: [๐งน Refactoring]
+ - title: ๐งช Testing
+ labels: [๐งช Testing]
+ - title: ๐ง Maintenance
+ labels: [๐ง Maintenance]
+ - title: ๐ฝ CI
+ labels: [๐ฝ CI]
+ - title: โ๏ธ Dependency Updates
+ labels: [โ๏ธ Dependencies, dependencies]
+ - title: ๐ Other Changes
+ labels: ["*"]
diff --git a/.github/renovate.json b/.github/renovate.json
new file mode 100644
index 0000000..704384f
--- /dev/null
+++ b/.github/renovate.json
@@ -0,0 +1,5 @@
+{
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+ "extends": ["config:best-practices"],
+ "dependencyDashboard": false
+}
diff --git a/.github/tagpr.ini b/.github/tagpr.ini
new file mode 100644
index 0000000..4e8b5fe
--- /dev/null
+++ b/.github/tagpr.ini
@@ -0,0 +1,9 @@
+[tagpr]
+ releaseBranch = main
+ versionFile = package.json
+ vPrefix = true
+ changelog = false
+ templateText = Release: {{ .NextVersion }}\n{{ .Changelog }}
+ majorLabels = ๐งจ Breaking Change
+ minorLabels = ๐ New Feature
+ commitPrefix = chore(release):
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..a465b78
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,46 @@
+name: ๐ฝ CI
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - "**.astro"
+ - "**.ts"
+ - bun.lockb
+ - .github/workflows/ci.yml
+ pull_request:
+ paths:
+ - "**.astro"
+ - "**.ts"
+ - bun.lockb
+ - .github/workflows/ci.yml
+
+jobs:
+ type-check:
+ name: ๐ Type Check
+ runs-on: Ubuntu-Latest
+
+ steps:
+ - name: ๐ Checkout Repository
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: ๐ Setup Bun with Cache
+ uses: ./.github/actions/setup-bun-with-cache
+
+ - name: ๐ Type Check
+ run: bun run check
+
+ build:
+ name: ๐ ๏ธ Build Check
+ runs-on: Ubuntu-Latest
+
+ steps:
+ - name: ๐ Checkout Repository
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: ๐ Setup Bun with Cache
+ uses: ./.github/actions/setup-bun-with-cache
+
+ - name: ๐ ๏ธ Build Check
+ run: bun run build
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..5414c25
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,29 @@
+name: ๐ Release
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ tagpr:
+ name: ๐ท๏ธ Release a New Version
+ permissions:
+ contents: write
+ pull-requests: write
+ runs-on: Ubuntu-Latest
+ outputs:
+ tag: ${{ steps.tagpr.outputs.tag }}
+
+ steps:
+ - name: ๐ Checkout Repository
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: ๐ท๏ธ Release a New Version
+ id: tagpr
+ uses: Songmu/tagpr@3dca11e7c0d68637ee212ddd35acc3d30a7403a4 # v1.5.0
+ with:
+ config: .github/tagpr.ini
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..10fc481
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,49 @@
+ci:
+ autofix_commit_msg: |
+ chore(fix): Auto fixes from pre-commit.com hooks
+
+ For more information, see https://pre-commit.ci.
+ autoupdate_commit_msg: "chore(deps): Bump pre-commit hook"
+
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v5.0.0
+ hooks:
+ - id: check-json
+ - id: check-toml
+ - id: check-yaml
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
+
+ - repo: https://github.com/Lucas-C/pre-commit-hooks
+ rev: v1.5.5
+ hooks:
+ - id: remove-tabs
+ args: [--whitespaces-count, "2"]
+
+ - repo: https://github.com/crate-ci/typos
+ rev: v1.27.0
+ hooks:
+ - id: typos
+
+ - repo: https://github.com/gitleaks/gitleaks
+ rev: v8.21.2
+ hooks:
+ - id: gitleaks
+
+ - repo: https://github.com/rhysd/actionlint
+ rev: v1.7.4
+ hooks:
+ - id: actionlint
+
+ - repo: https://github.com/igorshubovych/markdownlint-cli
+ rev: v0.42.0
+ hooks:
+ - id: markdownlint-fix
+ args: [--disable, MD013, MD023, MD024, MD033, MD036]
+
+ - repo: https://github.com/koalaman/shellcheck-precommit
+ rev: v0.10.0
+ hooks:
+ - id: shellcheck
+ args: [-e, "SC1071,SC1072,SC1073,SC1090,SC1091,SC2015,SC2148,SC2154"]