Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
354 changes: 300 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,65 +1,311 @@
# PictoPy
<div align="center">

PictoPy is an advanced desktop gallery application that combines the power of Tauri, React, and Rust for the frontend with a Python backend for sophisticated image analysis and management.
# 📸 PictoPy

# Want to Contribute? 😄
**Your Intelligent Photo Gallery - Powered by AI, Protected by Privacy**

Comment on lines +5 to 6
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Avoid bold “taglines” that act like headings (markdownlint MD036); use an actual heading level.

-**Your Intelligent Photo Gallery - Powered by AI, Protected by Privacy**
+## Your Intelligent Photo Gallery — Powered by AI, Protected by Privacy
...
-**Made with ❤️ by the PictoPy Community**
+### Made with ❤️ by the PictoPy Community

Also applies to: 304-307

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

5-5: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

🤖 Prompt for AI Agents
In README.md around lines 5-6 (and also affecting lines 304-307), the bold
tagline is being used like a heading which triggers markdownlint MD036; replace
the bolded line(s) with an actual markdown heading (e.g., start the line with
one or more # followed by a single, unbolded title) and remove the surrounding
** markers so the text is a proper heading instead of bold inline text.

&nbsp;&nbsp;&nbsp;<a href="https://discord.gg/hjUhu33uAn"><img src="https://github.com/user-attachments/assets/3ed93273-5055-4532-a524-87a337a4fbba" height="40"></a>
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![Discord](https://img.shields.io/discord/your-discord-id?color=7289da&label=Discord&logo=discord&logoColor=white)](https://discord.gg/hjUhu33uAn)
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Discord badge contains a placeholder 'your-discord-id' that needs to be replaced with the actual Discord server ID. You can find this by right-clicking your Discord server and selecting "Copy Server ID" (requires Developer Mode enabled).

Suggested change
[![Discord](https://img.shields.io/discord/your-discord-id?color=7289da&label=Discord&logo=discord&logoColor=white)](https://discord.gg/hjUhu33uAn)
[![Discord](https://img.shields.io/discord/1103723483780767824?color=7289da&label=Discord&logo=discord&logoColor=white)](https://discord.gg/hjUhu33uAn)

Copilot uses AI. Check for mistakes.
[![Made with Tauri](https://img.shields.io/badge/Made%20with-Tauri-FFC131?logo=tauri)](https://tauri.app)
[![Python](https://img.shields.io/badge/Python-3.11+-3776AB?logo=python&logoColor=white)](https://python.org)
[![React](https://img.shields.io/badge/React-18+-61DAFB?logo=react&logoColor=black)](https://reactjs.org)
[![TypeScript](https://img.shields.io/badge/TypeScript-5+-3178C6?logo=typescript&logoColor=white)](https://typescriptlang.org)

1. First, join the **[Discord Server](https://discord.gg/hjUhu33uAn) (Go to Projects->PictoPy)** to chat with everyone.
2. For detailed setup instructions, coding guidelines, and the contribution process, please check out our [CONTRIBUTING.md](./CONTRIBUTING.md) file.
[Features](#-features) • [Screenshots](#-screenshots) • [Getting Started](#-getting-started) • [Contributing](#-contributing) • [Documentation](#-documentation)
Comment on lines +7 to +14
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Read README.md to verify placeholder values at specified line ranges
wc -l README.md

Repository: AOSSIE-Org/PictoPy

Length of output: 75


🏁 Script executed:

#!/bin/bash
# Check lines 7-14 (already provided in snippet), then check other ranges
echo "=== Lines 126-141 (clone URL area) ==="
sed -n '126,141p' README.md

echo -e "\n=== Lines 211-228 (docs link area) ==="
sed -n '211,228p' README.md

echo -e "\n=== Lines 256-263 (contributors area) ==="
sed -n '256,263p' README.md

echo -e "\n=== Lines 287-299 (contact area) ==="
sed -n '287,299p' README.md

echo -e "\n=== Lines 308-309 (footer) ==="
sed -n '308,309p' README.md

Repository: AOSSIE-Org/PictoPy

Length of output: 1943


Replace placeholder URLs/IDs before merge (badges, clone URL, docs, issue tracker, contributors, contact).
Multiple instances of yourusername and placeholder values will break user onboarding and misdirect contributors.

-[![Discord](https://img.shields.io/discord/your-discord-id?color=7289da&label=Discord&logo=discord&logoColor=white)](https://discord.gg/hjUhu33uAn)
+[![Discord](https://img.shields.io/discord/<REAL_SERVER_ID>?color=7289da&label=Discord&logo=discord&logoColor=white)](https://discord.gg/hjUhu33uAn)

-git clone https://github.com/yourusername/PictoPy.git
+git clone https://github.com/AOSSIE-Org/PictoPy.git

-- 📖 [Full Documentation](https://yourusername.github.io/PictoPy)
+- 📖 [Full Documentation](https://<REAL_DOCS_SITE>)

-- Thanks to all our [contributors](https://github.com/yourusername/PictoPy/graphs/contributors)
+- Thanks to all our [contributors](https://github.com/AOSSIE-Org/PictoPy/graphs/contributors)

-- 🐛 [Issue Tracker](https://github.com/yourusername/PictoPy/issues)
+- 🐛 [Issue Tracker](https://github.com/AOSSIE-Org/PictoPy/issues)

-- 📧 [Contact Us](mailto:contact@pictopy.dev)
+- 📧 [Contact Us](mailto:<REAL_CONTACT_EMAIL>)

Also appears at lines 128, 213, and 308–309 in contribution/footer sections.

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

14-14: Link fragments should be valid

(MD051, link-fragments)

🤖 Prompt for AI Agents
In README.md around lines 7 to 14 (and also check occurrences at lines 128, 213,
and 308–309), there are placeholder URLs and IDs (e.g., your-discord-id,
yourusername, placeholder clone URL, docs, issue tracker, contributors, contact)
that must be replaced before merging; search the file for all placeholder tokens
and replace them with the project's real values (actual Discord server ID or
invite link, repository clone URL, real docs and issue tracker links,
license/author/contributor contacts, correct badge image links), verify each
replacement resolves and points to the live resource, and run a quick link-check
to ensure no remaining placeholders remain anywhere in the README.


# Architecture
</div>
Comment on lines +14 to +16
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# First, find and read the README.md file
find . -name "README.md" -type f | head -5

Repository: AOSSIE-Org/PictoPy

Length of output: 197


🏁 Script executed:

# Get the full README.md content with line numbers to examine the specific lines mentioned
wc -l README.md

Repository: AOSSIE-Org/PictoPy

Length of output: 75


🏁 Script executed:

# Read the README.md file to see the structure and the flagged lines
head -70 README.md | cat -n

Repository: AOSSIE-Org/PictoPy

Length of output: 3736


🏁 Script executed:

# Read lines around the flagged sections
sed -n '10,25p' README.md | cat -n
sed -n '32,40p' README.md | cat -n
sed -n '60,70p' README.md | cat -n
sed -n '110,120p' README.md | cat -n
sed -n '194,202p' README.md | cat -n
sed -n '251,260p' README.md | cat -n

Repository: AOSSIE-Org/PictoPy

Length of output: 2592


🌐 Web query:

GitHub markdown heading ID generation emojis anchor links

💡 Result:

Short answer — GitHub (and tools that emulate it) create heading IDs by "slugifying" the heading text: convert to lower‑case, strip formatting/punctuation/unsupported characters, replace spaces with hyphens, and make duplicates unique by appending -1, -2, etc. GitHub-style slugs are produced by the github-slugger algorithm; it also removes emoji characters (which can leave a leading hyphen if the emoji was at the start). [1][2]

Notes / examples:

  • "My Heading" → "my-heading". [2]
  • Duplicate headings get suffixes: "foo" → "foo", next "foo" → "foo-1". [2]
  • Emoji handling: "😄 emoji" → "-emoji" (the emoji is removed). [2]
  • GitHub docs summarize the rules: lower-case, spaces→hyphens, punctuation removed, markup stripped, uniqueness via -1, -2. [1]

If you need exact behavior for a specific renderer (GitHub.com, Enterprise, a static site generator, or a library), tell me which one and I’ll show the exact slug output and/or code you can reuse.

Sources:
[1] GitHub Docs — Basic writing and formatting syntax (automatic anchor rules).
[2] github-slugger (README / examples).


🌐 Web query:

GitHub heading fragment identifier emoji behavior

💡 Result:

Short answer: GitHub’s auto-generated heading anchors use the same slugification rules as the open-source github-slugger algorithm — emoji characters are removed (not preserved as emoji), so they can produce unexpected hyphens or empty segments in the slug. Example: the slugger maps "😄 emoji" → "-emoji". Use plain text, move or remove emoji, or set an explicit id to control the fragment. [1][2]

Sources:

  • GitHub docs: rules used to generate section links (lowercase, spaces→hyphens, remove punctuation/formatting). [1]
  • github-slugger (implementation and examples showing emoji handling, e.g. '😄 emoji' → '-emoji'). [2]

🌐 Web query:

GitHub heading anchor "#-features" emoji prefix hyphen works

💡 Result:

Short answer: It’s not reliable. GitHub’s slug rules remove punctuation and whitespace and lower-case text, but emoji handling is inconsistent across renderers — sometimes the emoji is stripped and you get a slug like "#-features" or "#features", sometimes the emoji (or its name) ends up in the slug. Test in your repo or, for a stable result, add an explicit anchor (e.g. or use heading {#features}). [1][2][3]

Sources:

  • GitHub Docs — rules used to generate heading anchors (punctuation removed, spaces → hyphens). [1]
  • github-slugger / markdown tooling that emulates GitHub slug rules. [2]
  • Reports/discussion showing inconsistent emoji behavior in headings/anchors. [3]

🌐 Web query:

GitHub markdown explicit anchor id HTML <a> tags fragment links

💡 Result:

Short answer

  • GitHub automatically generates anchors for headings; link with text. [1][4]
  • If you need an explicit anchor ID, add an HTML anchor before the heading: or then link to it with link. This works in README/markdown on github.com. [5][1]
  • Note: GitHub sanitizes HTML and may rewrite or prefix IDs (e.g. user-content-...) or strip some attributes, so prefer the heading-slug or test the rendered page to confirm the exact fragment. [6][2]

Examples

  • Heading auto-anchor:
    • Markdown: ## My Cool Heading
    • Link: Go. [1][4]
  • Explicit HTML anchor:
    • Markdown:

      Section title

    • Link: Jump. [5][1]

Sources
[1] GitHub Docs — Basic writing and formatting syntax (section links).
[2] GitHub community / markup discussion — HTML sanitization (IDs/classes may be affected).
[4] GitHub Flavored Markdown spec — fragment identifiers in links.
[5] Community examples/gists showing before headings.


🌐 Web query:

GitHub markdown heading attributes {#custom-id} syntax

💡 Result:

Short answer: GitHub.com (GFM) does not support Pandoc-/kramdown-style inline heading attributes like {#custom-id}. GitHub automatically generates anchor IDs for headings (you can link with #generated-id), but the {#id} attribute syntax is not part of the GFM spec. If you build a site with GitHub Pages using Jekyll/kramdown (or use a Markdown processor/plugin that supports it) you can add custom IDs via that processor’s attribute syntax (kramdown/Pandoc/markdown-it-attrs), or by writing raw HTML. (github.github.io)

Examples / options

  • GFM (github.com): rely on auto-generated heading IDs (no {#id} support). (github.github.io)
  • GitHub Pages with kramdown/Jekyll: enable kramdown and use its attribute/IAL syntax (processor-specific) to set IDs. (docs.github.com)
  • Other processors/plugins (Pandoc, markdown-it + markdown-it-attrs/markdown-it-anchor): support #id syntax (e.g. # Heading {#my-id}). (github.com)

If you tell me where you’re rendering the Markdown (github.com README, GitHub Pages, a static site generator, or a particular tool), I’ll give the exact syntax that will work there.

Citations:


Use explicit HTML anchors to replace emoji-dependent heading IDs for reliable section links.

The current anchor links (#-features, etc.) rely on GitHub's emoji stripping behavior, which is inconsistent across renderers. While <a name="id"></a> anchors are supported on GitHub.com, note that GitHub may sanitize and prefix IDs with user-content-, so test the rendered page to confirm the exact fragment identifiers work.

-[Features](#-features) • [Screenshots](#-screenshots) • [Getting Started](#-getting-started) • [Contributing](#-contributing) • [Documentation](#-documentation)
+<a name="features"></a>
+<a name="screenshots"></a>
+<a name="getting-started"></a>
+<a name="contributing"></a>
+<a name="documentation"></a>
+
+[Features](#features) • [Screenshots](#screenshots) • [Getting Started](#getting-started) • [Contributing](#contributing) • [Documentation](#documentation)

Also applies to: 35-36, 63-64, 113-114, 197-198, 254-256

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

14-14: Link fragments should be valid

(MD051, link-fragments)

🤖 Prompt for AI Agents
In README.md around lines 14-16 (also apply same change at 35-36, 63-64,
113-114, 197-198, 254-256), replace the emoji-dependent fragment links (e.g.
#‑features) by adding explicit HTML anchor elements with stable IDs immediately
before the corresponding section headings (for example: <a name="features"></a>
before the Features heading) and update the navigation links to point to those
stable IDs; after changes, test the rendered README on GitHub to verify the
final fragment identifiers (note GitHub may prefix with user-content- in some
contexts) and adjust anchor names if needed so links work reliably across
renderers.


---

## 🚀 About PictoPy

PictoPy is a **privacy-first, AI-powered desktop gallery application** that revolutionizes how you organize and search through your photo collection. Built with cutting-edge technologies, it combines the speed of Rust, the intelligence of Python AI models, and the elegance of modern web technologies - all while keeping your data **100% offline and secure**.

### ✨ What Makes PictoPy Special?

- 🤖 **AI-Powered Organization** - Automatically detect objects, faces, and scenes in your photos
- 🔒 **Privacy-First** - All processing happens locally. Your photos never leave your device
- ⚡ **Lightning Fast** - Built on Tauri and Rust for exceptional performance
- 🎯 **Smart Search** - Find photos by content, faces, or detected objects instantly
- 🎨 **Beautiful UI** - Modern, intuitive interface built with React and Tailwind CSS
- 🔄 **Cross-Platform** - Works seamlessly on Windows, macOS, and Linux

---

## ✨ Features

### 🖼️ **Intelligent Photo Management**
- **Auto-Tagging**: Automatically tag photos based on detected objects, people, and scenes
- **Face Recognition**: Group photos by detected faces with AI-powered clustering
- **Smart Albums**: Organize your photos with traditional album management tools
- **Advanced Search**: Search by objects, faces, dates, or custom tags

### 🧠 **Powered by State-of-the-Art AI**
- **YOLOv11** for real-time object detection
- **FaceNet** for accurate face recognition and embeddings
- **DBSCAN** clustering for intelligent face grouping
- **ONNX Runtime** for optimized model inference

### 🔐 **Privacy & Performance**
- **100% Offline** - All data stays on your local machine
- **No Cloud Required** - Process images without internet connection
- **Efficient Processing** - Background processing with parallel execution
- **Lightweight Database** - Fast SQLite storage for metadata and embeddings

### 🎨 **Modern User Experience**
- Clean, intuitive interface with dark mode support
- Responsive design that adapts to your workflow
- Real-time updates and smooth animations
- Keyboard shortcuts for power users

---

## 🖥️ Screenshots

<div align="center">

### Home Gallery View
![Home](docs/assets/screenshots/home.png)

### AI-Powered Tagging
![AI Tagging](docs/assets/screenshots/ai-tagging.png)

### Settings & Configuration
![Settings](docs/assets/screenshots/settings.png)

</div>

---

## 🛠️ Technical Stack

<table>
<tr>
<td width="50%" valign="top">

### Frontend
- **Framework**: React 18 + TypeScript
- **Desktop**: Tauri 2.0
- **Styling**: Tailwind CSS
- **UI Components**: ShadCN UI
- **State Management**: Redux Toolkit
- **Build Tool**: Vite
- **Routing**: React Router

</td>
<td width="50%" valign="top">

### Backend
- **Python API**: FastAPI
- **Rust Backend**: Tauri Core
- **Database**: SQLite
- **AI/ML**: ONNX Runtime, OpenCV
- **Object Detection**: YOLOv11
- **Face Recognition**: FaceNet
- **Async Processing**: asyncio

</td>
</tr>
</table>

---

## 🚀 Getting Started

### Prerequisites

Before you begin, ensure you have the following installed:

- **Node.js** 18+ and npm/yarn
- **Python** 3.11+
- **Rust** 1.70+ (for Tauri)
- **Git**

### Quick Setup

#### Option 1: Automated Setup (Recommended)

**Windows & Ubuntu/Debian:**
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The heading mentions "Windows & Ubuntu/Debian" but the script instructions below cover "Windows (PowerShell)" and "Linux/macOS". The heading should be updated to match the actual platforms covered, such as "Windows, Linux & macOS" or simply removed since the script instructions below already specify the platforms.

Suggested change
**Windows & Ubuntu/Debian:**
**Windows, Linux & macOS:**

Copilot uses AI. Check for mistakes.
```bash
# Clone the repository
git clone https://github.com/yourusername/PictoPy.git
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The URL contains a placeholder 'yourusername' that needs to be replaced with the actual GitHub username or organization name for the repository.

Suggested change
git clone https://github.com/yourusername/PictoPy.git
git clone https://github.com/PictoPy/PictoPy.git

Copilot uses AI. Check for mistakes.
cd PictoPy

# Run setup script
# Windows (PowerShell):
.\scripts\setup.ps1

# Linux/macOS:
./scripts/setup.sh
```

#### Option 2: Manual Setup

For detailed manual setup instructions for all operating systems, see our [Manual Setup Guide](docs/Manual_Setup_Guide.md).

### Running the Application

1. **Start the Python Backend:**
```bash
cd backend
python main.py
```

2. **Start the Frontend (in a new terminal):**
```bash
cd frontend
npm run tauri dev
```

- **Tauri**: Enables building the desktop application
- **React**: Used for creating the user interface
- **Rust**: Powers the backend, which the frontend communicates with through Tauri's API

### Backend (Python)

- **FastAPI**: Serves as the API framework
- **SQLite**: Database for storing metadata and embeddings
- **YOLO**: Used for object detection
- **FaceNet**: Generates face embeddings
- **ONNX Runtime**: Runs the models efficiently
- **DBSCAN**: Performs clustering for face embeddings

### Backend (Rust via Tauri)

Handles file system operations and provides a secure bridge between the frontend and local system.

## Features

- Smart tagging of photos based on detected objects, faces, and their recognition
- Traditional gallery features of album management
- Advanced image analysis with object detection and facial recognition
- Privacy-focused design with offline functionality
- Efficient data handling and parallel processing
- Smart search and retrieval
- Cross-platform compatibility

## Technical Stack

| Component | Technology |
| ----------------- | -------------------- |
| Frontend | React |
| Desktop Framework | Tauri |
| Rust Backend | Rust |
| Python Backend | Python |
| Database | SQLite |
| Image Processing | OpenCV, ONNX Runtime |
| Object Detection | YOLOv11 |
| Face Recognition | FaceNet |
| API Framework | FastAPI |
| State Management | Redux Toolkit |
| Styling | Tailwind CSS |
| Routing | React Router |
| UI Components | ShadCN |
| Build Tool | Vite |
| Type Checking | TypeScript |
The application will launch automatically!

---

Our Code of Conduct: [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)
## 📐 Architecture

```
┌─────────────────────────────────────────────────────────────┐
│ Desktop Application │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ React Frontend (TypeScript) │ │
│ │ • Modern UI Components (ShadCN) │ │
│ │ • State Management (Redux) │ │
│ │ • Routing & Navigation │ │
│ └───────────────────┬────────────────────────────────────┘ │
│ │ Tauri IPC │
│ ┌───────────────────▼────────────────────────────────────┐ │
│ │ Rust Backend (Tauri Core) │ │
│ │ • File System Operations │ │
│ │ • Secure System Bridge │ │
│ │ • Native OS Integration │ │
│ └───────────────────┬────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
│ HTTP/REST API
┌───────────────────────▼──────────────────────────────────────┐
│ Python Backend (FastAPI) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ AI Models │ │ Database │ │ Image Analysis │ │
│ │ • YOLOv11 │ │ SQLite │ │ • OpenCV │ │
│ │ • FaceNet │ │ • Metadata │ │ • ONNX │ │
│ │ • DBSCAN │ │ • Embeddings│ │ • Processing │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
└────────────────────────────────────────────────────────────┘
```
Comment on lines +166 to +193
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add a language tag to the fenced block (markdownlint MD040) and consider text for the ASCII diagram.

-```
+```text
┌─────────────────────────────────────────────────────────────┐
...
└────────────────────────────────────────────────────────────┘
-```
+```
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

166-166: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In README.md around lines 166 to 193 the fenced code block containing the ASCII
diagram lacks a language tag (violates markdownlint MD040); update the opening
fence to include a language tag (use "text") so it becomes ```text and ensure
the closing fence remains ``` so the block is a proper fenced code block with
the language specified.


---

## 🤝 Contributing

We welcome contributions from developers of all skill levels! Whether you're fixing bugs, adding features, or improving documentation, your help is appreciated.

### How to Contribute

1. **Join our [Discord Server](https://discord.gg/hjUhu33uAn)** (Projects → PictoPy) to connect with the community
2. Check out our [CONTRIBUTING.md](./CONTRIBUTING.md) for detailed guidelines
3. Review our [Code of Conduct](./CODE_OF_CONDUCT.md)
4. Fork the repository and create your feature branch
5. Make your changes and submit a pull request

### Development Workflow

```bash
# 1. Fork and clone the repository
git clone https://github.com/yourusername/PictoPy.git
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The URL contains a placeholder 'yourusername' that needs to be replaced with the actual GitHub username or organization name for the repository.

Suggested change
git clone https://github.com/yourusername/PictoPy.git
git clone https://github.com/<your-github-org-or-username>/PictoPy.git

Copilot uses AI. Check for mistakes.
cd PictoPy

# 2. Create a feature branch
git checkout -b feature/amazing-feature

# 3. Make your changes and test
npm test # Frontend tests
cd backend && pytest # Backend tests

# 4. Commit and push
git commit -m "Add amazing feature"
git push origin feature/amazing-feature

# 5. Open a Pull Request
```

### Testing

**Frontend:**
```bash
cd frontend
npm test # Run tests
npm run test:watch # Watch mode
```

**Backend:**
```bash
cd backend
pytest # Run all tests
pytest tests/test_albums.py # Run specific test
```

**Rust (Tauri):**
```bash
cd frontend/src-tauri
cargo test
```

---

## 📚 Documentation

- 📖 [Full Documentation](https://AOSSIE-Org
PictoPy.github.io/PictoPy)
Comment on lines +256 to +257
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix malformed documentation URL (line break in middle of URL).

The documentation URL is broken across lines and incomplete. Provide the correct, continuous URL.

-- 📖 [Full Documentation](https://AOSSIE-Org
-PictoPy.github.io/PictoPy)
+- 📖 [Full Documentation](https://<ACTUAL_DOCS_SITE>)
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

256-256: Bare URL used

(MD034, no-bare-urls)

🤖 Prompt for AI Agents
In README.md around lines 256 to 257, the documentation link is broken by a line
break inside the URL; replace the broken split text with a single continuous,
correct URL (for example: https://AOSSIE-Org/PictoPy.github.io/PictoPy) so the
markdown link renders and navigates correctly.

- 🔧 [Manual Setup Guide](docs/Manual_Setup_Guide.md)
- 🚀 [Script Setup Guide](docs/Script_Setup_Guide.md)
- 🏗️ [Architecture Overview](docs/overview/architecture.md)
- ✨ [Features Details](docs/overview/features.md)
- 🎨 [Frontend Documentation](docs/frontend/)
- 🐍 [Backend Documentation](docs/backend/)

---

## 🗺️ Roadmap

- [ ] 🎬 Video support and analysis
- [ ] 🌐 Multi-language support
- [ ] 📱 Mobile companion app
- [ ] ☁️ Optional cloud sync (encrypted)
- [ ] 🎨 Custom AI model training
- [ ] 🔍 Advanced similarity search
- [ ] 📊 Photo analytics dashboard
- [ ] 🤝 Shared albums (local network)

---

## 📄 License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

---

## 🙏 Acknowledgments

- Thanks to all our [contributors](https://github.com/yourusername/PictoPy/graphs/contributors)
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The contributors URL contains a placeholder 'yourusername' that needs to be replaced with the actual GitHub username or organization name for the repository.

Copilot uses AI. Check for mistakes.
- Built with amazing open-source technologies
- Special thanks to the Tauri, React, and FastAPI communities

---

## 🔗 Links

- 🌐 [Website](https://pictopy.dev) (if available)
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The website link includes a placeholder domain 'pictopy.dev' with "(if available)" note. If this website doesn't exist, this link should be removed or the line should be commented out to avoid broken links.

Suggested change
- 🌐 [Website](https://pictopy.dev) (if available)

Copilot uses AI. Check for mistakes.
- 💬 [Discord Community](https://discord.gg/hjUhu33uAn)
- 🐛 [Issue Tracker](https://github.com/yourusername/PictoPy/issues)
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The issue tracker URL contains a placeholder 'yourusername' that needs to be replaced with the actual GitHub username or organization name for the repository.

Copilot uses AI. Check for mistakes.
- 📧 [Contact Us](mailto:contact@pictopy.dev)
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The contact email 'contact@pictopy.dev' appears to be a placeholder. If this email address is not active, this link should be removed or replaced with a valid contact method.

Suggested change
- 📧 [Contact Us](mailto:contact@pictopy.dev)

Copilot uses AI. Check for mistakes.

---

<div align="center">

**Made with ❤️ by the PictoPy Community**

⭐ Star us on GitHub — it helps!

[Report Bug](https://github.com/yourusername/PictoPy/issues) · [Request Feature](https://github.com/yourusername/PictoPy/issues) · [Join Discord](https://discord.gg/hjUhu33uAn)
Copy link

Copilot AI Dec 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The bug report and feature request URLs contain a placeholder 'yourusername' that needs to be replaced with the actual GitHub username or organization name for the repository.

Copilot uses AI. Check for mistakes.

</div>