mirror of
https://github.com/Dvorinka/Trackeep.git
synced 2026-06-04 04:22:57 +00:00
Compare commits
3 Commits
v1.2.6
...
446bc7acfb
| Author | SHA1 | Date | |
|---|---|---|---|
| 446bc7acfb | |||
| 90f0b90cc7 | |||
| ecd31f4e3b |
@@ -14,6 +14,8 @@
|
||||
<span> • </span>
|
||||
<a href="#features">Features</a>
|
||||
<span> • </span>
|
||||
<a href="#releases">Releases</a>
|
||||
<span> • </span>
|
||||
<a href="#tech-stack">Tech Stack</a>
|
||||
<span> • </span>
|
||||
<a href="#documentation">Documentation</a>
|
||||
@@ -25,6 +27,7 @@
|
||||
<img src="./scorecard.png" alt="Code Quality Score" width="100%">
|
||||
</p>
|
||||
|
||||
|
||||
## 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.
|
||||
@@ -453,6 +456,104 @@ This project is built with amazing open-source technologies:
|
||||
- **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
|
||||
|
||||
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);
|
||||
|
||||
// Initialize update store
|
||||
updateStore.ensureInitialized();
|
||||
updateStore.ensureInitialized().catch(console.error);
|
||||
|
||||
const installUpdate = () => {
|
||||
updateStore.installUpdate();
|
||||
|
||||
@@ -148,7 +148,7 @@ export const updateService = {
|
||||
},
|
||||
|
||||
// Get current app version from package.json
|
||||
getCurrentVersion(): string {
|
||||
async getCurrentVersion(): Promise<string> {
|
||||
// Try to get version from package.json first, then fallback
|
||||
try {
|
||||
const response = await fetch('/package.json');
|
||||
|
||||
@@ -116,9 +116,9 @@ const cancelUpdate = () => {
|
||||
};
|
||||
|
||||
// Initialize update checking
|
||||
const initializeUpdateChecking = () => {
|
||||
const initializeUpdateChecking = async () => {
|
||||
// Set current version
|
||||
setCurrentVersion(updateService.getCurrentVersion());
|
||||
setCurrentVersion(await updateService.getCurrentVersion());
|
||||
|
||||
// Check if last check was more than 24 hours ago
|
||||
const lastCheckTimeStr = localStorage.getItem('lastUpdateCheck');
|
||||
@@ -150,9 +150,9 @@ const cleanup = () => {
|
||||
|
||||
// Auto-initialize when store is imported
|
||||
let initialized = false;
|
||||
const ensureInitialized = () => {
|
||||
const ensureInitialized = async () => {
|
||||
if (!initialized) {
|
||||
initializeUpdateChecking();
|
||||
await initializeUpdateChecking();
|
||||
initialized = true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
/* Bundler mode */
|
||||
"moduleResolution": "bundler",
|
||||
"allowImportingTsExtensions": true,
|
||||
"verbatimModuleSyntax": true,
|
||||
"moduleDetection": "force",
|
||||
"noEmit": true,
|
||||
"jsx": "preserve",
|
||||
|
||||
Reference in New Issue
Block a user