mirror of
https://github.com/clucraft/PriceGhost.git
synced 2026-06-23 15:48:08 +02:00
Add version tracking and v1.0.0 release
- Create CHANGELOG.md documenting all features - Add version.json for version tracking - Display version in Settings page footer with links to Changelog and GitHub - Tag release as v1.0.0 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
ccbc188487
commit
5e67e76504
4 changed files with 138 additions and 0 deletions
87
CHANGELOG.md
Normal file
87
CHANGELOG.md
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to PriceGhost will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [1.0.0] - 2026-01-23
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
#### Core Features
|
||||||
|
- Universal price scraping with site-specific extractors for Amazon, Walmart, Best Buy, Target, eBay, Newegg, Home Depot, Costco, and AliExpress
|
||||||
|
- JSON-LD structured data extraction for broad site compatibility
|
||||||
|
- Puppeteer headless browser fallback with stealth plugin for JavaScript-rendered pages
|
||||||
|
- Price history tracking with interactive charts (7d, 30d, 90d, all time)
|
||||||
|
- 7-day sparkline graphs on dashboard for quick trend overview
|
||||||
|
- Configurable check intervals (5 minutes to 24 hours)
|
||||||
|
- Live countdown timers and progress bars showing time until next check
|
||||||
|
- Staggered checking with jitter to prevent rate limiting
|
||||||
|
|
||||||
|
#### AI Features
|
||||||
|
- AI-powered price extraction fallback (Anthropic Claude, OpenAI GPT, Ollama local)
|
||||||
|
- AI price verification to catch scraping errors (e.g., scraping savings amounts instead of actual prices)
|
||||||
|
- AI status badges showing verification status (✓ verified, ⚡ corrected)
|
||||||
|
|
||||||
|
#### Notifications
|
||||||
|
- Telegram bot notifications
|
||||||
|
- Discord webhook notifications
|
||||||
|
- Pushover push notifications
|
||||||
|
- ntfy.sh notifications (no account required)
|
||||||
|
- Price drop alerts with configurable thresholds
|
||||||
|
- Target price alerts
|
||||||
|
- Back-in-stock alerts
|
||||||
|
- Per-channel enable/disable toggles
|
||||||
|
- Test notification buttons for each channel
|
||||||
|
|
||||||
|
#### Stock Tracking
|
||||||
|
- Out-of-stock detection with visual indicators
|
||||||
|
- Stock status history tracking
|
||||||
|
- Stock timeline visualization
|
||||||
|
- Back-in-stock notification alerts
|
||||||
|
|
||||||
|
#### User Interface
|
||||||
|
- Dark/Light mode with system theme auto-detection
|
||||||
|
- Responsive design for desktop and mobile
|
||||||
|
- Toast notifications for user feedback
|
||||||
|
- Dashboard with list layout, search, and sorting
|
||||||
|
- Bulk actions (select multiple products, bulk delete)
|
||||||
|
- Historical low price indicators
|
||||||
|
- Product notification badges showing configured alerts
|
||||||
|
|
||||||
|
#### User Management
|
||||||
|
- Multi-user support with JWT authentication
|
||||||
|
- Admin panel for user management
|
||||||
|
- Registration enable/disable control
|
||||||
|
- Profile management (name, password)
|
||||||
|
- Password visibility toggle for sensitive fields
|
||||||
|
|
||||||
|
#### PWA & Mobile
|
||||||
|
- Progressive Web App support
|
||||||
|
- Add to Home Screen capability
|
||||||
|
- Service worker for offline caching
|
||||||
|
- Custom ghost icon
|
||||||
|
|
||||||
|
#### Currency Support
|
||||||
|
- USD, EUR, GBP, CHF, CAD, AUD, JPY, INR support
|
||||||
|
- Automatic currency detection from scraped pages
|
||||||
|
|
||||||
|
#### Deployment
|
||||||
|
- Docker and Docker Compose support
|
||||||
|
- GitHub Container Registry images
|
||||||
|
- GitHub Actions CI/CD workflow
|
||||||
|
|
||||||
|
### Security
|
||||||
|
- JWT-based authentication
|
||||||
|
- bcrypt password hashing
|
||||||
|
- Input validation throughout
|
||||||
|
- Secure API design
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
|
||||||
|
| Version | Date | Description |
|
||||||
|
|---------|------|-------------|
|
||||||
|
| 1.0.0 | 2026-01-23 | Initial public release |
|
||||||
4
frontend/public/version.json
Normal file
4
frontend/public/version.json
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"version": "1.0.0",
|
||||||
|
"releaseDate": "2026-01-23"
|
||||||
|
}
|
||||||
|
|
@ -14,11 +14,17 @@ import {
|
||||||
|
|
||||||
type SettingsSection = 'profile' | 'notifications' | 'ai' | 'admin';
|
type SettingsSection = 'profile' | 'notifications' | 'ai' | 'admin';
|
||||||
|
|
||||||
|
interface VersionInfo {
|
||||||
|
version: string;
|
||||||
|
releaseDate: string;
|
||||||
|
}
|
||||||
|
|
||||||
export default function Settings() {
|
export default function Settings() {
|
||||||
const [activeSection, setActiveSection] = useState<SettingsSection>('profile');
|
const [activeSection, setActiveSection] = useState<SettingsSection>('profile');
|
||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
const [error, setError] = useState('');
|
const [error, setError] = useState('');
|
||||||
const [success, setSuccess] = useState('');
|
const [success, setSuccess] = useState('');
|
||||||
|
const [versionInfo, setVersionInfo] = useState<VersionInfo | null>(null);
|
||||||
|
|
||||||
// Profile state
|
// Profile state
|
||||||
const [profile, setProfile] = useState<UserProfile | null>(null);
|
const [profile, setProfile] = useState<UserProfile | null>(null);
|
||||||
|
|
@ -72,6 +78,11 @@ export default function Settings() {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchInitialData();
|
fetchInitialData();
|
||||||
|
// Fetch version info
|
||||||
|
fetch('/version.json')
|
||||||
|
.then(res => res.json())
|
||||||
|
.then(data => setVersionInfo(data))
|
||||||
|
.catch(() => {}); // Silently fail if version.json not found
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const fetchInitialData = async () => {
|
const fetchInitialData = async () => {
|
||||||
|
|
@ -1698,6 +1709,38 @@ export default function Settings() {
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Version Info */}
|
||||||
|
{versionInfo && (
|
||||||
|
<div style={{
|
||||||
|
marginTop: '2rem',
|
||||||
|
paddingTop: '1rem',
|
||||||
|
borderTop: '1px solid var(--border)',
|
||||||
|
textAlign: 'center',
|
||||||
|
color: 'var(--text-muted)',
|
||||||
|
fontSize: '0.75rem',
|
||||||
|
}}>
|
||||||
|
<span>PriceGhost v{versionInfo.version}</span>
|
||||||
|
<span style={{ margin: '0 0.5rem' }}>•</span>
|
||||||
|
<a
|
||||||
|
href="https://github.com/clucraft/PriceGhost/blob/main/CHANGELOG.md"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
style={{ color: 'var(--primary)', textDecoration: 'none' }}
|
||||||
|
>
|
||||||
|
Changelog
|
||||||
|
</a>
|
||||||
|
<span style={{ margin: '0 0.5rem' }}>•</span>
|
||||||
|
<a
|
||||||
|
href="https://github.com/clucraft/PriceGhost"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
style={{ color: 'var(--primary)', textDecoration: 'none' }}
|
||||||
|
>
|
||||||
|
GitHub
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
4
version.json
Normal file
4
version.json
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"version": "1.0.0",
|
||||||
|
"releaseDate": "2026-01-23"
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue