diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 08e82ac..8077222 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -131,3 +131,9 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Restart HF Space after successful build + restart-hf-space: + needs: build-and-push + if: success() + uses: ./.github/workflows/hf-space-restart.yml + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/hf-space-restart.yml b/.github/workflows/hf-space-restart.yml new file mode 100644 index 0000000..c107f32 --- /dev/null +++ b/.github/workflows/hf-space-restart.yml @@ -0,0 +1,46 @@ +name: Restart Hugging Face Space + +on: + # Can be called from other workflows + workflow_call: + # Can be triggered manually + workflow_dispatch: + # Scheduled reset (daily at midnight UTC) + schedule: + - cron: '0 0 * * *' # Daily at midnight UTC + +jobs: + restart-space: + runs-on: ubuntu-latest + steps: + - name: Restart Hugging Face Space + run: | + echo "Triggering HF Space restart to pull latest image..." + + if [ -z "${{ vars.HF_SPACE_ID }}" ]; then + echo "::warning::HF_SPACE_ID variable not set. Skipping HF restart." + exit 0 + fi + + if [ -z "${{ secrets.HF_TOKEN }}" ]; then + echo "::warning::HF_TOKEN secret not set. Skipping HF restart." + exit 0 + fi + + RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \ + "https://huggingface.co/api/spaces/${{ vars.HF_SPACE_ID }}/restart" \ + -H "Authorization: Bearer ${{ secrets.HF_TOKEN }}" \ + -H "Content-Type: application/json") + + HTTP_CODE=$(echo "$RESPONSE" | tail -n1) + BODY=$(echo "$RESPONSE" | sed '$d') + + if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ]; then + echo "โ HF Space restart triggered successfully!" + echo "Space: ${{ vars.HF_SPACE_ID }}" + else + echo "::warning::HF Space restart failed (HTTP $HTTP_CODE)" + echo "Response: $BODY" + echo "Space may not exist or token may be invalid." + fi + diff --git a/README.md b/README.md index bb6ddf1..6ac18ad 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ ๐ **[Visit the official website](https://www.notediscovery.com)** +๐ **[Try the Live Demo](https://gamosoft-notediscovery.hf.space)** โ *Contents reset daily, for demonstration purposes only* + ## What is NoteDiscovery? NoteDiscovery is a **lightweight, self-hosted note-taking application** that puts you in complete control of your knowledge base. Write, organize, and discover your notes with a beautiful, modern interfaceโall running on your own server. diff --git a/docs/carousel-1.jpg b/docs/carousel-1.jpg new file mode 100644 index 0000000..c5875a3 Binary files /dev/null and b/docs/carousel-1.jpg differ diff --git a/docs/carousel-2.jpg b/docs/carousel-2.jpg new file mode 100644 index 0000000..6089d83 Binary files /dev/null and b/docs/carousel-2.jpg differ diff --git a/docs/carousel-3.jpg b/docs/carousel-3.jpg new file mode 100644 index 0000000..fb7286b Binary files /dev/null and b/docs/carousel-3.jpg differ diff --git a/docs/carousel-4.jpg b/docs/carousel-4.jpg new file mode 100644 index 0000000..87a0dec Binary files /dev/null and b/docs/carousel-4.jpg differ diff --git a/docs/index.html b/docs/index.html index bf3f16f..bace773 100644 --- a/docs/index.html +++ b/docs/index.html @@ -193,18 +193,25 @@ margin: 0 auto; } + .cta-buttons { + display: flex; + gap: 1rem; + justify-content: center; + flex-wrap: wrap; + margin-top: 1.5rem; + } + .cta-button { display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; - padding: 1rem 3rem; + padding: 1rem 2.5rem; border-radius: 50px; text-decoration: none; - font-size: 1.2rem; + font-size: 1.1rem; font-weight: 600; transition: transform 0.2s, box-shadow 0.2s; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); - margin-top: 1rem; } .cta-button:hover { @@ -212,6 +219,27 @@ box-shadow: 0 6px 20px rgba(102, 126, 234, 0.6); } + .cta-button.demo { + background: linear-gradient(135deg, #10b981 0%, #059669 100%); + box-shadow: 0 4px 15px rgba(16, 185, 129, 0.4); + } + + .cta-button.demo:hover { + box-shadow: 0 6px 20px rgba(16, 185, 129, 0.6); + } + + .cta-button.demo::before { + content: "โถ "; + } + + .demo-notice { + margin-top: 1rem; + font-size: 0.85rem; + color: #6b7280; + font-style: italic; + opacity: 0.9; + } + .features { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); @@ -290,6 +318,56 @@ margin-bottom: 0.25rem; } + /* Scroll Animations */ + @keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(40px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + @keyframes fadeInScale { + from { + opacity: 0; + transform: scale(0.9); + } + to { + opacity: 1; + transform: scale(1); + } + } + + .animate-on-scroll { + opacity: 0; + } + + .animate-on-scroll.animated { + animation: fadeInUp 0.6s ease-out forwards; + } + + .animate-on-scroll.animated-scale { + animation: fadeInScale 0.6s ease-out forwards; + } + + /* Stagger animation delays for feature cards */ + .feature.animated:nth-child(1) { animation-delay: 0s; } + .feature.animated:nth-child(2) { animation-delay: 0.1s; } + .feature.animated:nth-child(3) { animation-delay: 0.2s; } + .feature.animated:nth-child(4) { animation-delay: 0.05s; } + .feature.animated:nth-child(5) { animation-delay: 0.15s; } + .feature.animated:nth-child(6) { animation-delay: 0.25s; } + .feature.animated:nth-child(7) { animation-delay: 0.1s; } + .feature.animated:nth-child(8) { animation-delay: 0.2s; } + .feature.animated:nth-child(9) { animation-delay: 0.3s; } + .feature.animated:nth-child(10) { animation-delay: 0.15s; } + .feature.animated:nth-child(11) { animation-delay: 0.25s; } + .feature.animated:nth-child(12) { animation-delay: 0.35s; } + .feature.animated:nth-child(13) { animation-delay: 0.2s; } + .screenshot-section { margin: 4rem 0 3rem 0; text-align: center; @@ -319,17 +397,34 @@ padding: 0 1rem; } + /* Screenshot Carousel */ + .carousel { + position: relative; + overflow: hidden; + } + + .carousel-track { + display: flex; + transition: transform 0.5s ease-in-out; + width: 100%; + } + + .carousel-slide { + width: 100%; + min-width: 100%; + flex: 0 0 100%; + } + .screenshot-frame { background: var(--card-bg); border-radius: 12px; padding: 0.5rem; box-shadow: 0 20px 60px var(--shadow); - transition: transform 0.3s ease, box-shadow 0.3s ease, background 0.3s ease; + transition: box-shadow 0.3s ease, background 0.3s ease; overflow: hidden; } .screenshot-frame:hover { - transform: translateY(-5px); box-shadow: 0 25px 80px var(--shadow); } @@ -343,6 +438,14 @@ margin-bottom: 0.5rem; } + .screenshot-title { + flex: 1; + text-align: center; + font-size: 0.85rem; + color: var(--text-secondary); + font-weight: 500; + } + .screenshot-dots { display: flex; gap: 0.4rem; @@ -365,6 +468,60 @@ border-radius: 0 0 8px 8px; } + /* Carousel Navigation */ + .carousel-nav { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + margin-top: 1.5rem; + } + + .carousel-btn { + background: rgba(255, 255, 255, 0.2); + border: 2px solid rgba(255, 255, 255, 0.3); + border-radius: 50%; + width: 44px; + height: 44px; + cursor: pointer; + font-size: 1.2rem; + color: white; + transition: all 0.3s ease; + backdrop-filter: blur(10px); + display: flex; + align-items: center; + justify-content: center; + } + + .carousel-btn:hover { + background: rgba(255, 255, 255, 0.3); + transform: scale(1.1); + } + + .carousel-indicators { + display: flex; + gap: 0.5rem; + } + + .carousel-indicator { + width: 10px; + height: 10px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.3); + border: none; + cursor: pointer; + transition: all 0.3s ease; + } + + .carousel-indicator.active { + background: white; + transform: scale(1.2); + } + + .carousel-indicator:hover { + background: rgba(255, 255, 255, 0.6); + } + footer { text-align: center; padding: 3rem 0; @@ -475,6 +632,27 @@ width: 10px; height: 10px; } + + .screenshot-title { + font-size: 0.75rem; + } + + .carousel-btn { + width: 36px; + height: 36px; + font-size: 1rem; + } + + .cta-buttons { + flex-direction: column; + align-items: center; + } + + .cta-button { + width: 100%; + max-width: 280px; + text-align: center; + } } @@ -506,112 +684,174 @@
Your Self-Hosted Knowledge Base
-A lightweight, privacy-focused note-taking application with powerful features: LaTeX math equations, Mermaid diagrams, smart tags, custom templates, code highlighting, and more. Write, organize, and discover your notes with a beautiful, modern interfaceโall running on your own server.
- Get Started on GitHub โ + +โจ Demo resets daily ยท For demonstration purposes only
A clean, intuitive interface designed for productivity and focus
Your notes never leave your server. Complete data ownership and privacy.
No subscriptions, no hidden fees. Free and open source forever.
Instant search and navigation. Works offline, always responsive.
Beautiful equation rendering with MathJax. Perfect for scientific notes.
Create flowcharts, mind maps, and diagrams with Mermaid syntax.
Syntax highlighting for popular coding languages. Developer-friendly notes.
Organize with YAML frontmatter tags. Collapsible properties panel shows metadata at a glance.
Create from custom templates with dynamic placeholders. Meeting notes, journals, and more.
Link notes with [[double brackets]] Obsidian-style. Broken links shown dimmed.
Interactive visualization of connected notes. Drag to explore relationships.
Plain markdown files in folders. No vendor lock-in, easy backups.
8 built-in themes with dark/light modes and full customization.
Plugin system lets you add custom features and integrations.
Join the self-hosting community and take back control of your notes today.
- View on GitHub โ + +โจ Demo resets daily ยท For demonstration purposes only