mirror of
https://github.com/Dvorinka/Trackeep.git
synced 2026-06-04 20:42:59 +00:00
Compare commits
3 Commits
v1.2.6
..
446bc7acfb
| Author | SHA1 | Date | |
|---|---|---|---|
| 446bc7acfb | |||
| 90f0b90cc7 | |||
| ecd31f4e3b |
@@ -14,6 +14,8 @@
|
|||||||
<span> • </span>
|
<span> • </span>
|
||||||
<a href="#features">Features</a>
|
<a href="#features">Features</a>
|
||||||
<span> • </span>
|
<span> • </span>
|
||||||
|
<a href="#releases">Releases</a>
|
||||||
|
<span> • </span>
|
||||||
<a href="#tech-stack">Tech Stack</a>
|
<a href="#tech-stack">Tech Stack</a>
|
||||||
<span> • </span>
|
<span> • </span>
|
||||||
<a href="#documentation">Documentation</a>
|
<a href="#documentation">Documentation</a>
|
||||||
@@ -25,6 +27,7 @@
|
|||||||
<img src="./scorecard.png" alt="Code Quality Score" width="100%">
|
<img src="./scorecard.png" alt="Code Quality Score" width="100%">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
I built Trackeep because I was tired of juggling a dozen different apps for my digital life. You know how it is – bookmarks in one place, tasks in another, random notes scattered everywhere, and that great article you meant to read somewhere in your browser history.
|
I built Trackeep because I was tired of juggling a dozen different apps for my digital life. You know how it is – bookmarks in one place, tasks in another, random notes scattered everywhere, and that great article you meant to read somewhere in your browser history.
|
||||||
@@ -453,6 +456,104 @@ This project is built with amazing open-source technologies:
|
|||||||
- **DevOps**: Docker, GitHub Actions
|
- **DevOps**: Docker, GitHub Actions
|
||||||
|
|
||||||
|
|
||||||
|
## 🚀 Releases & Updates
|
||||||
|
|
||||||
|
Trackeep uses automated semantic versioning and Docker-based updates. No manual setup required!
|
||||||
|
|
||||||
|
### 📋 How Updates Work
|
||||||
|
|
||||||
|
Users get updates automatically through the built-in update system:
|
||||||
|
- ✅ **Auto-checks** every 24 hours for new versions
|
||||||
|
- ✅ **UI notifications** appear in left navigation when updates available
|
||||||
|
- ✅ **One-click install** pulls latest Docker images and restarts services
|
||||||
|
- ✅ **Zero setup** - just run `docker compose up` and it works
|
||||||
|
|
||||||
|
### 🏷️ Version Management
|
||||||
|
|
||||||
|
Versions are managed automatically through semantic versioning (MAJOR.MINOR.PATCH):
|
||||||
|
|
||||||
|
- **Frontend**: Version from `frontend/package.json`
|
||||||
|
- **Backend**: Version from `backend/go.mod`
|
||||||
|
- **Detection**: Automatic from source code (no env vars needed)
|
||||||
|
|
||||||
|
### 🚀 Creating Releases
|
||||||
|
|
||||||
|
#### Method 1: Automated (Recommended)
|
||||||
|
|
||||||
|
For new features or bug fixes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Commit your changes
|
||||||
|
git commit -m "feat: add new amazing feature"
|
||||||
|
|
||||||
|
# 2. Create version tag and push (triggers automated release)
|
||||||
|
git tag v1.2.7
|
||||||
|
git push origin main v1.2.7
|
||||||
|
```
|
||||||
|
|
||||||
|
**What happens automatically:**
|
||||||
|
1. GitHub Actions detects the version tag
|
||||||
|
2. Updates all version files (`package.json`, `go.mod`, docker-compose files)
|
||||||
|
3. Builds Docker images with proper semantic tags
|
||||||
|
4. Pushes to GitHub Container Registry (`latest` + versioned tags)
|
||||||
|
5. Creates GitHub release with changelog
|
||||||
|
6. Updates `latest` tags to point to new version
|
||||||
|
|
||||||
|
#### Method 2: Manual
|
||||||
|
|
||||||
|
For precise control:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Use version update script
|
||||||
|
./scripts/update-version.sh 1.2.7
|
||||||
|
|
||||||
|
# Commit and push
|
||||||
|
git add . && git commit -m "chore: bump version to 1.2.7"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🐳 Docker Images
|
||||||
|
|
||||||
|
Images are automatically built and pushed to GitHub Container Registry:
|
||||||
|
|
||||||
|
- **Registry**: `ghcr.io/dvorinka/trackeep`
|
||||||
|
- **Latest tags**: `backend:latest`, `frontend:latest` (for updates)
|
||||||
|
- **Versioned tags**: `backend:1.2.6`, `frontend:1.2.6` (for rollback)
|
||||||
|
- **Automatic builds**: Triggered by Git tags
|
||||||
|
|
||||||
|
### 📖 Semantic Versioning
|
||||||
|
|
||||||
|
Follow industry standard (MAJOR.MINOR.PATCH):
|
||||||
|
|
||||||
|
```
|
||||||
|
1.2.6 → 1.3.0 (MINOR: new features)
|
||||||
|
1.2.6 → 1.2.7 (PATCH: bug fixes)
|
||||||
|
1.2.6 → 2.0.0 (MAJOR: breaking changes)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🔧 Development Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone and run
|
||||||
|
git clone https://github.com/Dvorinka/Trackeep.git
|
||||||
|
cd Trackeep
|
||||||
|
|
||||||
|
# Start with automatic updates
|
||||||
|
docker compose up
|
||||||
|
|
||||||
|
# System automatically:
|
||||||
|
# - Detects version from source code
|
||||||
|
# - Checks for updates every 24h
|
||||||
|
# - Shows update notifications in UI
|
||||||
|
# - Installs updates with one click
|
||||||
|
```
|
||||||
|
|
||||||
|
### 📚 Documentation
|
||||||
|
|
||||||
|
- **Version workflow**: See [docs/SIMPLIFIED_VERSION_SYSTEM.md](docs/SIMPLIFIED_VERSION_SYSTEM.md)
|
||||||
|
- **API documentation**: See [docs/API.md](docs/API.md)
|
||||||
|
- **Update system**: See [docs/AUTO_UPDATE_GUIDE.md](docs/AUTO_UPDATE_GUIDE.md)
|
||||||
|
|
||||||
## A Personal Note
|
## A Personal Note
|
||||||
|
|
||||||
Thank you for taking the time to look at my project. Trackeep represents months of learning, building, and dreaming – all in the service of creating something that makes our digital lives a little more organized and a lot more meaningful.
|
Thank you for taking the time to look at my project. Trackeep represents months of learning, building, and dreaming – all in the service of creating something that makes our digital lives a little more organized and a lot more meaningful.
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export function UpdateChecker(props: UpdateCheckerProps) {
|
|||||||
const [showUpdateModal, setShowUpdateModal] = createSignal(false);
|
const [showUpdateModal, setShowUpdateModal] = createSignal(false);
|
||||||
|
|
||||||
// Initialize update store
|
// Initialize update store
|
||||||
updateStore.ensureInitialized();
|
updateStore.ensureInitialized().catch(console.error);
|
||||||
|
|
||||||
const installUpdate = () => {
|
const installUpdate = () => {
|
||||||
updateStore.installUpdate();
|
updateStore.installUpdate();
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ export const updateService = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// Get current app version from package.json
|
// Get current app version from package.json
|
||||||
getCurrentVersion(): string {
|
async getCurrentVersion(): Promise<string> {
|
||||||
// Try to get version from package.json first, then fallback
|
// Try to get version from package.json first, then fallback
|
||||||
try {
|
try {
|
||||||
const response = await fetch('/package.json');
|
const response = await fetch('/package.json');
|
||||||
|
|||||||
@@ -116,9 +116,9 @@ const cancelUpdate = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Initialize update checking
|
// Initialize update checking
|
||||||
const initializeUpdateChecking = () => {
|
const initializeUpdateChecking = async () => {
|
||||||
// Set current version
|
// Set current version
|
||||||
setCurrentVersion(updateService.getCurrentVersion());
|
setCurrentVersion(await updateService.getCurrentVersion());
|
||||||
|
|
||||||
// Check if last check was more than 24 hours ago
|
// Check if last check was more than 24 hours ago
|
||||||
const lastCheckTimeStr = localStorage.getItem('lastUpdateCheck');
|
const lastCheckTimeStr = localStorage.getItem('lastUpdateCheck');
|
||||||
@@ -150,9 +150,9 @@ const cleanup = () => {
|
|||||||
|
|
||||||
// Auto-initialize when store is imported
|
// Auto-initialize when store is imported
|
||||||
let initialized = false;
|
let initialized = false;
|
||||||
const ensureInitialized = () => {
|
const ensureInitialized = async () => {
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
initializeUpdateChecking();
|
await initializeUpdateChecking();
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
/* Bundler mode */
|
/* Bundler mode */
|
||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"allowImportingTsExtensions": true,
|
"allowImportingTsExtensions": true,
|
||||||
"verbatimModuleSyntax": true,
|
|
||||||
"moduleDetection": "force",
|
"moduleDetection": "force",
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
"jsx": "preserve",
|
"jsx": "preserve",
|
||||||
|
|||||||
Reference in New Issue
Block a user