<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: peckjon</title>
    <description>The latest articles on DEV Community by peckjon (@peckjon).</description>
    <link>https://dev.to/peckjon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F47186%2F5ee90a29-d565-4b19-ad77-dc5fdabeeec5.jpg</url>
      <title>DEV Community: peckjon</title>
      <link>https://dev.to/peckjon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/peckjon"/>
    <language>en</language>
    <item>
      <title>Building an AI-Powered Image Search Engine with Daft.ai</title>
      <dc:creator>peckjon</dc:creator>
      <pubDate>Wed, 16 Jul 2025 04:25:00 +0000</pubDate>
      <link>https://dev.to/peckjon/building-an-ai-powered-image-search-engine-with-daftai-3gcj</link>
      <guid>https://dev.to/peckjon/building-an-ai-powered-image-search-engine-with-daftai-3gcj</guid>
      <description>
  
  Image Playground demo using Daft.ai


&lt;p&gt;Back when ML models mainly lived on self-hosted servers instead of smartphones, I spent a few years with &lt;a href="https://github.com/algorithmiaio" rel="noopener noreferrer"&gt;Algorithmia&lt;/a&gt;, building some of the first and best ML (now "AI") hosting services. Many of my days were spent deep in the trenches with Python datascientists, churning through Jupyter notebooks, optimizing their algorithms to run in ephemeral serverless environments. Those were the days when data transformation pipelines required complex orchestration of multiple tools, custom scripts for every file format, and endless debugging of memory issues and race conditions.&lt;/p&gt;

&lt;p&gt;Fast-forward to today: after years focused on DevOps and other areas of software development, I've been itching to get back into data science – and wow, the modern landscape is a revelation. Enter &lt;a href="https://daft.ai" rel="noopener noreferrer"&gt;Daft&lt;/a&gt;: a distributed Python dataframe library designed to handle complex data workloads with the elegance of Pandas but the power to scale. What caught my attention wasn't just another dataframe library, but Daft's native support for multimodal data processing and SQL-based query capabilities. This felt like the perfect opportunity to build something practical while exploring what makes Daft exciting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Daft is Worth Your Attention
&lt;/h2&gt;

&lt;p&gt;Daft represents a significant step forward in data processing, especially for teams working with unstructured data. Unlike traditional dataframes that treat multimedia as mere file paths, Daft can natively decode, process, and manipulate images directly within its processing pipeline. This means you can resize thousands of images, extract features, or run ML inference – all using familiar dataframe operations that can scale across multiple cores or even distributed clusters.&lt;/p&gt;

&lt;p&gt;Structured data gets an upgrade, too! Daft's built-in support for SQL queries works across nonrelational data, such as JSON... so those of us who grew up writing SQL92 feel just as comfortable querying a wide variety of formats.&lt;/p&gt;

&lt;p&gt;The three Daft features that really shine in this project are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔍 &lt;a href="https://docs.getdaft.io/en/stable/api/io/#daft.from_glob_path" rel="noopener noreferrer"&gt;Image Discovery &amp;amp; File Processing&lt;/a&gt;&lt;/strong&gt;: Using &lt;code&gt;daft.from_glob_path()&lt;/code&gt;, we can recursively discover image files across directory structures with built-in filtering by extension. No more writing custom directory traversal code or managing file system complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚡ &lt;a href="https://docs.getdaft.io/en/stable/api/expressions/#daft.expressions.expressions.ExpressionImageNamespace" rel="noopener noreferrer"&gt;Bulk Image Processing&lt;/a&gt;&lt;/strong&gt;: Daft's native image operations let us chain &lt;code&gt;.image.decode()&lt;/code&gt;, &lt;code&gt;.image.resize()&lt;/code&gt;, and &lt;code&gt;.image.encode()&lt;/code&gt; in a single pipeline. This means processing thousands of photos happens in parallel without having to manually manage Pillow operations, threading, or memory concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📊 &lt;a href="https://docs.getdaft.io/en/stable/sql_overview/" rel="noopener noreferrer"&gt;SQL Query over JSON&lt;/a&gt;&lt;/strong&gt;: Once our image metadata is processed, Daft's SQL interface &lt;code&gt;daft.sql()&lt;/code&gt; lets us write SQL queries directly over our JSON data structures, including complex operations that replace slow and cumbersome dataframe operations -- like array explosions for tag searching, and querying across multiple fields simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Demo: Where Theory Meets Practice
&lt;/h2&gt;

&lt;p&gt;This image search tool demonstrates how these capabilities come together. The application discovers images in local folders, processes them through AI models for automatic captioning and tagging, then creates a searchable web interface. Here's where Daft eliminated entire categories of complexity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No manual file system traversal&lt;/strong&gt; – Daft's glob patterns handle recursive file discovery: &lt;a href="https://github.com/peckjon/daft-image-playground/blob/main/image_processor.py#L40" rel="noopener noreferrer"&gt;image_processor.py#L40&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No individual image resize operations&lt;/strong&gt; – Daft's bulk image pipeline processes everything in parallel (no sequential Pillow operations!): &lt;a href="https://github.com/peckjon/daft-image-playground/blob/main/image_processor.py#L135" rel="noopener noreferrer"&gt;image_processor.py#L135&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No complex JSON parsing for search&lt;/strong&gt; – SQL queries over structured data feel natural and performant: &lt;a href="https://github.com/peckjon/daft-image-playground/blob/main/app.py#L95-L106" rel="noopener noreferrer"&gt;app.py#L95-L106&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No manual parallelization&lt;/strong&gt; – Daft handles efficient resource utilization automatically: &lt;a href="https://github.com/peckjon/daft-image-playground/blob/main/image_processor.py#L132" rel="noopener noreferrer"&gt;image_processor.py#L132&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? Clean, readable code that focuses on business logic rather than infrastructure concerns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development Notes &amp;amp; Caveats
&lt;/h2&gt;

&lt;p&gt;Full transparency: while the initial code generation was aided by GitHub Copilot and Claude Sonnet 4 (you can see the original prompt in &lt;a href="https://github.com/peckjon/daft-image-playground/blob/main/PRD.md" rel="noopener noreferrer"&gt;PRD.md&lt;/a&gt; – itself pair-generated with Copilot's help), the real work happened in the development iterations. AI tools are incredibly powerful accelerators, but they work best when guided by an experienced developer who understands the problem domain and can refine the generated solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: This is a demo application only and should not be used unmodified in a production environment. It may contain security vulnerabilities and is optimized for simplicity and compatibility, not efficiency. For example, the BLIP model used for image captioning is a few years old and not state-of-the-art – I chose it for its reliability and broad compatibility rather than cutting-edge performance.&lt;/p&gt;

&lt;p&gt;This project showcases only a tiny slice of &lt;a href="https://daft.ai" rel="noopener noreferrer"&gt;Daft's capabilities&lt;/a&gt;. The framework supports everything from distributed computing across cloud infrastructure to advanced ML workloads with GPU acceleration. If you're dealing with large-scale data processing, multimedia pipelines, or looking to modernize your data infrastructure, there's a lot more to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to dive in?
&lt;/h2&gt;

&lt;p&gt;🚀 &lt;a href="https://github.com/peckjon/daft-image-playground" rel="noopener noreferrer"&gt;Jump right into the code&lt;/a&gt; or read the detailed implementation guide below!&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔄 Data Loader
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Folder Processing&lt;/strong&gt;: Select any local folder containing images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursive Discovery&lt;/strong&gt;: Automatically finds images in all subfolders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Tagging&lt;/strong&gt;: Uses BLIP model for automatic image captioning and tagging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch Processing&lt;/strong&gt;: Efficiently processes large image collections using Daft.ai&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress Tracking&lt;/strong&gt;: Real-time updates on processing status&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔍 Image Library
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smart Search&lt;/strong&gt;: Search images using natural language descriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag-Based Filtering&lt;/strong&gt;: Find images by automatically generated tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Preview&lt;/strong&gt;: Grid view with hover effects and click-to-expand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detailed View&lt;/strong&gt;: Modal with full image, caption, tags, and metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt;: Works on desktop and mobile devices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.9 or higher&lt;/li&gt;
&lt;li&gt;4GB+ RAM (for AI model)&lt;/li&gt;
&lt;li&gt;Modern web browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clone or download this repository&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the setup script:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;chmod&lt;/span&gt; +x setup.sh
   ./setup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start the application:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
   python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open your browser to:&lt;/strong&gt; &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Usage Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Processing Images
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Go to the Data Loader page&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enter your image folder path&lt;/strong&gt; (e.g., &lt;code&gt;/Users/yourname/Pictures&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click "Start Processing"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wait for completion&lt;/strong&gt; - the first run will download the AI model&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example folder paths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS: &lt;code&gt;/Users/yourname/Pictures/vacation&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Linux: &lt;code&gt;/home/yourname/photos&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Windows: &lt;code&gt;C:\\Users\\yourname\\Pictures&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Searching Images
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Go to the Image Library page&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enter search terms&lt;/strong&gt; like:

&lt;ul&gt;
&lt;li&gt;"dog" (finds images with dogs)&lt;/li&gt;
&lt;li&gt;"outdoor" (finds outdoor scenes)&lt;/li&gt;
&lt;li&gt;"person" (finds images with people)&lt;/li&gt;
&lt;li&gt;"mountain landscape" (finds mountain landscapes)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click on images&lt;/strong&gt; to see full size with details&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Technical Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Backend (Flask)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;REST API&lt;/strong&gt; for image processing and search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job management&lt;/strong&gt; for long-running processing tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File serving&lt;/strong&gt; for processed images&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Pipeline (Daft.ai)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Efficient file discovery&lt;/strong&gt; using glob patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel processing&lt;/strong&gt; for image operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory-efficient&lt;/strong&gt; handling of large datasets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI Processing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BLIP Model&lt;/strong&gt;: Salesforce's BLIP for image captioning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Tagging&lt;/strong&gt;: Extracts objects and scenes from captions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardized Output&lt;/strong&gt;: Consistent 224x224 processed images&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Storage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"photo.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"original_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/full/path/photo.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"processed_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"photo_abc123.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1024576&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"created_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-07-14T10:30:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"outdoor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"landscape"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mountains"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"caption"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A beautiful mountain landscape"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"processed_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-07-14T15:45:00"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Supported Image Formats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;JPEG/JPG&lt;/li&gt;
&lt;li&gt;PNG&lt;/li&gt;
&lt;li&gt;GIF&lt;/li&gt;
&lt;li&gt;BMP&lt;/li&gt;
&lt;li&gt;WEBP&lt;/li&gt;
&lt;li&gt;TIFF&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  API Endpoints
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/process&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start image processing job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/jobs/{id}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get processing job status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search images by text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/images&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get all processed images&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  File Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;daft-image-playground/
├── app.py                 # Flask application
├── image_processor.py     # Core processing logic
├── requirements.txt       # Python dependencies
├── setup.sh              # Setup script
├── LICENSE               # MIT License
├── templates/            # HTML templates
│   ├── data_loader.html
│   └── image_library.html
├── data/                 # Generated data files
├── processed_images/     # Resized images
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Performance Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;First Run&lt;/strong&gt;: Model download may take 2-5 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processing Speed&lt;/strong&gt;: Varies by hardware and image size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;: ~2-4GB during processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: Processed images are ~50KB each (224x224 JPEG)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Size&lt;/strong&gt;: ~1GB&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Issues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"Model download failed"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure internet connection for first run&lt;/li&gt;
&lt;li&gt;Check disk space (model is ~1GB)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Permission denied"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure image folder is readable&lt;/li&gt;
&lt;li&gt;Use absolute paths, not relative&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Out of memory"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Process smaller batches&lt;/li&gt;
&lt;li&gt;Close other applications&lt;/li&gt;
&lt;li&gt;Consider upgrading RAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"No images found"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check folder path is correct&lt;/li&gt;
&lt;li&gt;Ensure folder contains supported image formats&lt;/li&gt;
&lt;li&gt;Verify folder permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Logs and Debugging
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Processing logs appear in the terminal&lt;/li&gt;
&lt;li&gt;Check browser console for frontend errors&lt;/li&gt;
&lt;li&gt;Job status API provides detailed error messages&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Interested in taking this further? A few suggestions:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Custom Image Models:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace BLIP model in &lt;code&gt;image_processor.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Modify tag generation logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Search Improvements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add vector similarity search&lt;/li&gt;
&lt;li&gt;Implement advanced filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;UI Enhancements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add sorting options&lt;/li&gt;
&lt;li&gt;Implement image collections&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dependencies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daft.ai&lt;/strong&gt;: Distributed data processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transformers&lt;/strong&gt;: Hugging Face model library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flask&lt;/strong&gt;: Web framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bootstrap&lt;/strong&gt;: UI framework&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;This project is licensed under the MIT License - see the &lt;a href="https://dev.toLICENSE"&gt;LICENSE&lt;/a&gt; file for details.&lt;/p&gt;

&lt;p&gt;MIT License allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Use commercially&lt;/li&gt;
&lt;li&gt;✅ Modify and distribute&lt;/li&gt;
&lt;li&gt;✅ Place warranty&lt;/li&gt;
&lt;li&gt;✅ Use patents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only requirement is to include the original copyright notice.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Need Help?&lt;/strong&gt; Check the troubleshooting section or create an issue on GitHub.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>datascience</category>
      <category>tutorial</category>
      <category>imagerecognition</category>
    </item>
    <item>
      <title>A checklist and guide to get your repository collaboration-ready</title>
      <dc:creator>peckjon</dc:creator>
      <pubDate>Wed, 18 Sep 2024 18:44:15 +0000</pubDate>
      <link>https://dev.to/github/a-checklist-and-guide-to-get-your-repository-collaboration-ready-3eld</link>
      <guid>https://dev.to/github/a-checklist-and-guide-to-get-your-repository-collaboration-ready-3eld</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Want the TL;DR, or you’ve already been using GitHub for a while? Skip to the end for a printable checklist that you can use to ensure that you’ve covered all aspects of making your repository collaboration-ready.&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My daughter has a pair of pet gerbils. They’re awesome, but not the most complex creatures to care for. They need their cage cleaned occasionally, their food and water refilled, and may need a neighbor to check in on them if we’re away for a while. But someday, she may have a pet that requires more care and attention–a cat or dog perhaps, which needs to be played with and nurtured every day–so she’ll want to have a few good friends who know her pet and can be their companion whenever she’s away. And someday, she may even have a child of her own, making her connections to community and family ever more important. As the saying goes, it takes a village to raise a child.&lt;/p&gt;

&lt;p&gt;So it goes with code projects. My colleagues and I often refer to our projects as “pets” or even “children” (sometimes jokingly, sometimes obsessively). We pour a lot of our own care and attention into them, but it can be easy to forget how important the community’s contributions can be to their success. In the world of software development, collaboration can make the difference between a brittle last-minute release and a reliable, maintainable, pain-free project. Whether you’ve been coding for a day or a decade, your colleagues are there to help strengthen your work. But they can only help if you’ve given them the tools to do so.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm13ak7a9w6z7xf83dszt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm13ak7a9w6z7xf83dszt.png" alt="Two gerbils typing on a keyboard" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your primary responsibility as the creator or maintainer of a repository is to ensure that others can appropriately use, understand, and even contribute to the project. GitHub is here to support that mission, but ensuring that a repository is collaboration-ready takes a bit more effort than using &lt;code&gt;git clone&lt;/code&gt;. So read on to learn the settings, content, and behaviors that will help you succeed.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Repository settings&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://docs.github.com/repositories/managing-your-repositorys-settings-and-features" rel="noopener noreferrer"&gt;settings of your repository&lt;/a&gt; lay the foundation for collaboration. They determine who can see and contribute to your project, how contributions are reviewed, and what happens to those contributions once they are submitted. Properly used, they can foster an environment in which contributors across the globe will find, make use of, and help build your project. In a corporate setting, they help shift developers from a siloed way of thinking and building to a “search-first, collaborate-first” mindset. This practice, known as &lt;a href="https://gh.io/innersource" rel="noopener noreferrer"&gt;innersourcing&lt;/a&gt;, reduces redundant work and accelerates the whole company.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4b1ups8622i9vgfjy0b7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4b1ups8622i9vgfjy0b7.png" alt="Screenshot of the " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Visibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You’re aiming to maximize contributions and reuse, but that doesn’t always mean making your repository public, especially in a corporate setting where information privacy is a consideration. You have several options available in the “Settings” tab of your repository.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public&lt;/strong&gt; lets anyone in the world see and copy your code, and generally allows them to create issues or pull requests, so they can provide feedback about whether it works well, or even suggest (but not force) changes to improve it. This is generally great for personal projects containing no protected information (those tokens are all &lt;a href="https://docs.github.com/actions/security-guides/encrypted-secrets" rel="noopener noreferrer"&gt;stored separately&lt;/a&gt;, right?) but only for certain “blessed” company projects.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal&lt;/strong&gt; is a &lt;a href="https://docs.github.com/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/setting-repository-visibility#making-a-repository-internal" rel="noopener noreferrer"&gt;special visibility level&lt;/a&gt; used by &lt;a href="https://github.com/enterprise" rel="noopener noreferrer"&gt;GitHub Enterprise&lt;/a&gt;, allowing anyone inside your organization to see the repository, but nobody in the outside world. We generally suggest this as the default level for company projects that don’t have siloed sensitive information (such as customer-specific data or logic that only a specific group should know about).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private&lt;/strong&gt; is the most restrictive option, and can be a collaboration-killer. Use this option sparingly, and if you do, be sure to invite some collaborators.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaborators&lt;/strong&gt; are specific individuals or teams you &lt;a href="https://docs.github.com/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository" rel="noopener noreferrer"&gt;invite to be part of&lt;/a&gt; your project. They can be given specific &lt;a href="https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization" rel="noopener noreferrer"&gt;roles&lt;/a&gt; such as “Read” (allowing them to see your otherwise private repository), “Write” (letting them directly commit or manage pull requests), “Admin”, and many others.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Protect the main branch&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While you want to maximize the number of people who can see and contribute to your project, you still need to ensure that their contributions are properly reviewed, both by your core team members and by automation. In most cases, you’ll want to create a &lt;a href="https://github.blog/2023-07-24-github-repository-rules-are-now-generally-available/" rel="noopener noreferrer"&gt;repository rule&lt;/a&gt; (the modern replacement for &lt;a href="https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches" rel="noopener noreferrer"&gt;branch protection&lt;/a&gt;) on your main branch and configure it to require a pull request before merging is allowed. By requiring at least one approver, ideally one from your CODEOWNERS file (discussed in the next section), you’ll guarantee that another human reviews each set of changes. In addition, you will want to have automated tools such as unit tests run against each pull request; these are known as &lt;a href="https://docs.github.com/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks" rel="noopener noreferrer"&gt;status checks&lt;/a&gt; and will be covered under “&lt;a href="https://github.blog/enterprise-software/collaboration/a-checklist-and-guide-to-get-your-repository-collaboration-ready/#3-automation-and-checks" rel="noopener noreferrer"&gt;Automation and checks&lt;/a&gt;” below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft73gqfo5gixlqpi2ogej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft73gqfo5gixlqpi2ogej.png" alt="Screenshot: the settings " width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Repository contents&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Software projects don’t just consist of code. Your repository should act as a guide to collaborators, letting them know why it exists, how to use it appropriately, and the best ways to contribute. Adding a few key files (generally written using &lt;a href="https://docs.github.com/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax" rel="noopener noreferrer"&gt;Markdown&lt;/a&gt;) will help other people discover your project and understand how to collaborate effectively.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;README.md&lt;/code&gt;: This is the first file visitors to your repository will see, so it is critical to &lt;a href="https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-readmes" rel="noopener noreferrer"&gt;include in your repository&lt;/a&gt;. It should describe what your project does, how to use the repository, and any configuration needed. Additionally, a good README includes the mission of the project, what it aims to do, and why it exists. Lastly, be sure to describe how and by whom the project is maintained.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;LICENSE.md&lt;/code&gt;: A license file defines what others can and can’t do with your code and other content. Whether your goal is to allow unrestricted use of your project, or to add special restrictions on its usage and distribution, it’s crucial to include a license. Visit &lt;a href="https://choosealicense.com/" rel="noopener noreferrer"&gt;choosealicense.com&lt;/a&gt; for guidance on which license might work best for your project, then &lt;a href="https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository" rel="noopener noreferrer"&gt;add one&lt;/a&gt; to your repository.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CONTRIBUTING.md&lt;/code&gt;: You can reduce the amount of confusion and friction that potential contributors (and you) face by clearly defining why and how others can contribute new code, documentation, art, or other elements to your project. If the contribution steps are very simple, you might just include them in your README; but, if you find it takes more than a paragraph or two (and it usually does), it’s best to create this separate file. It should include information about the types of contributions you’re looking for, how to propose a new feature or bug fix, the process for submitting pull requests, and any specific coding standards or style guidelines contributors should follow. For a good example, take a look at the &lt;a href="https://github.com/github/docs/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contributor guide from GitHub’s docs project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CODEOWNERS&lt;/code&gt;: A &lt;a href="https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners" rel="noopener noreferrer"&gt;CODEOWNERS file&lt;/a&gt; assigns one or more users who will be responsible for code in a particular part of your repository. As specified in the repository settings, these individuals will be automatically requested for review when someone opens a pull request that modifies code they own. Note that this file, unlike the others mentioned here, should &lt;em&gt;not&lt;/em&gt; have the “.md” extension.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CODE\_OF\_CONDUCT.md&lt;/code&gt;: A code of conduct establishes the social norms, rules, and responsibilities that participants in your project should follow. It promotes a friendly and respectful environment for collaboration, and it is easy to add &lt;a href="https://docs.github.com/communities/setting-up-your-project-for-healthy-contributions/adding-a-code-of-conduct-to-your-project" rel="noopener noreferrer"&gt;manually or by using one of GitHub’s templates&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;With these files in place, your repository will be much more approachable and understandable, and you should start seeing contributions flow more freely. But if you want to go even further, there’s even more you can do to &lt;a href="https://docs.github.com/communities/setting-up-your-project-for-healthy-contributions" rel="noopener noreferrer"&gt;set up your project for healthy contributions&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Automation and checks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrhmn9ebzloboyfy295v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrhmn9ebzloboyfy295v.png" alt="Two gerbils in The Matrix" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s time to enter the Matrix. As Agent Smith is fond of saying, “Never send a human to do a machine’s job.” While you generally want at least one human reviewer for each major change, you should make their job as easy as possible. GitHub’s built-in automation and CI/CD system, &lt;a href="https://docs.github.com/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;, allows you to run workflows in response to file changes, pull requests, external triggers such as chat tools, and even cron jobs. Let’s look at a few ways this can make collaborators’ lives easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Linting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Linters are tools that analyze code to detect various types of errors and enforce a consistent coding style. Incorporating linters into your development process can greatly improve the readability and quality of your code, making it easier for others to understand and contribute to your project. One of the most popular is &lt;a href="https://github.com/marketplace/actions/super-linter" rel="noopener noreferrer"&gt;Super-Linter&lt;/a&gt;, which can be initially configured in &lt;a href="https://github.com/super-linter/super-linter#example-connecting-github-action-workflow" rel="noopener noreferrer"&gt;a single cut-and-paste step&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Building and testing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While the exact compilers and test suites you run will be specific to the language and framework of your application, most can be executed automatically in your repository. To find the right ones, search through GitHub Marketplace’s list of &lt;a href="https://github.com/marketplace?query=build" rel="noopener noreferrer"&gt;Build&lt;/a&gt; and &lt;a href="https://github.com/marketplace?category=testing" rel="noopener noreferrer"&gt;Test Apps &amp;amp; Actions&lt;/a&gt;, then follow the instructions specific to your preferred tool. Or, execute them by &lt;a href="https://docs.github.com/actions/learn-github-actions/essential-features-of-github-actions#adding-scripts-to-your-workflow" rel="noopener noreferrer"&gt;running command-line scripts and arguments in your GitHub Actions workflow&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Checks&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When information is surfaced to reviewers right inside the pull request, it makes their job faster and easier, eliminating the need for them to manually run test suites or run through a physical checklist. If the automated checks fail, you can even block deployments from going out the door. Once you’ve added a linter or test suite as described above, and &lt;strong&gt;&lt;em&gt;it has run at least once&lt;/em&gt;&lt;/strong&gt;, consider configuring it as a &lt;a href="https://docs.github.com/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks" rel="noopener noreferrer"&gt;status check&lt;/a&gt; in your repository settings. This will help ensure that your app is properly tested each and every time a pull request is created.&lt;/p&gt;

&lt;p&gt;This is not a complete list, but every project is different, so also consider what other &lt;a href="https://github.com/marketplace?category=code-quality" rel="noopener noreferrer"&gt;code quality&lt;/a&gt;, &lt;a href="https://github.com/marketplace?category=dependency-management" rel="noopener noreferrer"&gt;dependency management&lt;/a&gt;, or &lt;a href="https://github.com/marketplace?category=deployment" rel="noopener noreferrer"&gt;pre-release automation&lt;/a&gt; you might want to include. Then, consider how you want to deploy the project. In most cases, you’ll find there is a component in the &lt;a href="https://github.com/marketplace" rel="noopener noreferrer"&gt;GitHub Marketplace&lt;/a&gt; that provides turnkey integration with your favorite infrastructure provider, but it’s also possible to &lt;a href="https://docs.github.com/actions/deployment/about-deployments/deploying-with-github-actions" rel="noopener noreferrer"&gt;write your own GitHub Action&lt;/a&gt; to deploy your app after all the checks have passed. And, for high-volume enterprise projects, consider using &lt;a href="https://github.blog/2023-07-12-github-merge-queue-is-generally-available/" rel="noopener noreferrer"&gt;merge queues&lt;/a&gt; if you start getting traffic jams on rapidly changing branches.&lt;/p&gt;

&lt;p&gt;With these automation tools and checks in place, you can have more confidence in the quality and consistency of contributions to your repository and spend less time manually managing the process.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. Security&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flufc464wxe6sg4iyp5iw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flufc464wxe6sg4iyp5iw.png" alt="Screenshot of the Security overview page of a repository" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Security is a paramount concern in any software project and is especially important when including a variety of collaborators who may have different levels of security training (or none at all). Fortunately, there are a few simple steps you can take to protect your code, data, and users from potential threats.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Roles&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Carefully decide which &lt;a href="https://docs.github.com/organizations/managing-user-access-to-your-organizations-repositories/repository-roles-for-an-organization" rel="noopener noreferrer"&gt;roles&lt;/a&gt;, and thus permissions, you give to collaborators in your repository. Generally speaking, you’ll want to assign the “Read” role to the general public. “Triage” and “Write” are for trusted individuals such as members of your company or working group (but only once protected branches and checks have been set up). “Maintain” and “Admin” roles are best for your core maintainers, who are responsible for reviewing and managing what goes into production. Also consider that “Triage” and above have the ability to manage issues, discussions, and comments–so you’ll want to trust that they have the commitment and background to manage the flow of metadata surrounding your project. Enterprise customers can take advantage of &lt;a href="https://docs.github.com/enterprise-cloud@latest/organizations/managing-peoples-access-to-your-organization-with-roles/managing-custom-repository-roles-for-an-organization" rel="noopener noreferrer"&gt;custom repository roles&lt;/a&gt; for more granular permissions control.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Secrets management&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Secrets are sensitive data like API keys, passwords, and certificates that you need to keep private. You don’t want these to be directly embedded into your code or your logs; instead, you should use either a third-party keystore or GitHub’s native secret-management tools, which can be found under the “Secrets and Variables” section of your repository settings. There, you’ll find separate sections &lt;a href="https://docs.github.com/codespaces/managing-codespaces-for-your-organization/managing-encrypted-secrets-for-your-repository-and-organization-for-github-codespaces" rel="noopener noreferrer"&gt;for GitHub Codespaces&lt;/a&gt; (a tool described in the “Advanced Options” section below) and &lt;a href="https://docs.github.com/actions/security-guides/encrypted-secrets" rel="noopener noreferrer"&gt;for GitHub Actions&lt;/a&gt;, because you may want to use different secrets during development than you do in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Security scanners&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Scanning code for vulnerabilities is &lt;a href="https://github.com/features/security" rel="noopener noreferrer"&gt;a complex topic&lt;/a&gt;, but breaks down into three major categories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;: 80-90% of most applications’ code comes from third-party sources–the frameworks and packages we build the rest of our code on top of. GitHub Dependabot is available on all public repositories, and can be &lt;a href="https://docs.github.com/code-security/dependabot/dependabot-security-updates/configuring-dependabot-security-updates" rel="noopener noreferrer"&gt;automatically enabled&lt;/a&gt; across entire organizations. It is able to alert you (and help provide a fix) whenever an insecure dependency is found. To ensure that Dependabot is running, check the “security” tab at the top of your repository. You can also enable &lt;a href="https://docs.github.com/code-security/dependabot/dependabot-version-updates" rel="noopener noreferrer"&gt;dependency version updates&lt;/a&gt; to let you know when new versions of packages are available, so you can keep up-to-date even if an explicit vulnerability has not been identified.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets&lt;/strong&gt;: While you should already be using a secret manager as described above, we all make mistakes, and some tokens may slip through the cracks and get embedded directly into code. &lt;a href="https://docs.github.com/code-security/secret-scanning/about-secret-scanning" rel="noopener noreferrer"&gt;Secret scanning&lt;/a&gt; tools, provided both through &lt;a href="https://github.com/marketplace?category=security&amp;amp;type=actions&amp;amp;query=secret+" rel="noopener noreferrer"&gt;third-party integrations&lt;/a&gt; and via &lt;a href="https://docs.github.com/get-started/learning-about-github/about-github-advanced-security#about-advanced-security-features" rel="noopener noreferrer"&gt;GitHub Advanced Security&lt;/a&gt; for Enterprises, can notify you about or even block secret tokens as they are pushed into your repository.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novel Vulnerabilities&lt;/strong&gt;: As you write new code, you may accidentally add new vulnerabilities, either in the novel code itself or in the way you wire together existing components. There are a &lt;a href="https://github.com/marketplace?category=security" rel="noopener noreferrer"&gt;wide variety&lt;/a&gt; of ways to scan your overall application, some of which are language-dependant. Enterprises can also rely on GitHub Advanced Security’s &lt;a href="https://docs.github.com/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning" rel="noopener noreferrer"&gt;code scanning&lt;/a&gt; to find a wide variety of flaws, from SQL injection to circular references, in &lt;a href="https://docs.github.com/get-started/learning-about-github/github-language-support" rel="noopener noreferrer"&gt;most popular coding languages&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;SECURITY.md and private vulnerability reporting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If a user or security researcher identifies a problem with your project, they need to know how to securely and responsibly report it. Include a &lt;a href="https://docs.github.com/code-security/getting-started/adding-a-security-policy-to-your-repository" rel="noopener noreferrer"&gt;security policy file&lt;/a&gt; in your repository to provide these guidelines and to help maintain the trust of your users and the wider community. Also turn on &lt;a href="https://docs.github.com/code-security/security-advisories/repository-security-advisories/configuring-private-vulnerability-reporting-for-a-repository" rel="noopener noreferrer"&gt;private vulnerability reporting&lt;/a&gt;; this allows security researchers to securely report any vulnerabilities they find!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. Advanced options&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqouqiatsqlvw5vuii1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqouqiatsqlvw5vuii1f.png" alt="Two gerbils speed through the cosmos on a space-bike" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beyond the basics, there are a number of advanced options you can leverage to further enhance your repository’s collaboration readiness.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Issue templates&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As collaborators make use of your project, they will file &lt;a href="https://docs.github.com/issues/tracking-your-work-with-issues" rel="noopener noreferrer"&gt;issues&lt;/a&gt; asking for bug fixes and enhancements. By default, these requests will be fairly unstructured, and you may need to loop back to the creator several times to get all the information you need. By creating a few &lt;a href="https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository" rel="noopener noreferrer"&gt;issue templates&lt;/a&gt;, you can provide guidance, define which required and optional fields users will see, and set up specific options they’ll select when opening issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GitHub Codespaces configuration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub Codespaces provides a complete, configurable dev environment on top of a repository. This allows anyone to work on your project from anywhere, without having to set up a local environment. &lt;a href="https://docs.github.com/codespaces/setting-up-your-project-for-codespaces" rel="noopener noreferrer"&gt;Providing a well-configured codespace&lt;/a&gt; can make it much easier for others to contribute to your project and makes the project less brittle, since all developers will be working from the same configuration (eliminating the “it works on my machine but not yours” problem).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Environments&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment" rel="noopener noreferrer"&gt;GitHub Environments&lt;/a&gt; let you specify where certain tasks (like deployments) should happen. They can be configured with specific protection rules, ensuring that important tasks only happen in a controlled and secure manner.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;6. Next steps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that you’ve set up your repository, it’s time to consider the broader aspects of collaboration, including your role as a maintainer and how you engage with your community.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Responsiveness&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As a maintainer, your responsiveness plays a crucial role in fostering a healthy, collaborative environment. This involves promptly addressing issues and pull requests, providing feedback, and guiding new contributors. Set aside specific times each week that you’ll dedicate toward responding to changes and remediating problems. If you want to measure how responsive your project is, check out the &lt;a href="https://github.blog/2023-07-19-metrics-for-issues-pull-requests-and-discussions/" rel="noopener noreferrer"&gt;Metrics Action&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Project management&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub’s native &lt;a href="https://github.com/features/issues" rel="noopener noreferrer"&gt;project planning&lt;/a&gt; capabilities are usable both for individual projects and enterprise-wide collaboration. Set up &lt;a href="https://docs.github.com/issues/planning-and-tracking-with-projects" rel="noopener noreferrer"&gt;GitHub Projects&lt;/a&gt; to manage your work and provide visibility to your community. This not only helps you stay organized, but also allows others to understand the current status of the project and where they can contribute.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Visibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A well-maintained repository is of little use if nobody knows about it. Promote your project through blog posts, demos, or even dedicated project portals. The more people who know about your project, the more potential contributors and users you can attract.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Community engagement&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Engaging with your community is key to fostering a healthy, collaborative environment. This might involve organizing meetups, running a project blog, or even just actively participating in discussions.&lt;/p&gt;

&lt;p&gt;By following these standards, you can ensure that your repository is not just collaboration-ready, but also a place where a vibrant community can flourish! Print out &lt;a href="https://raw.githubusercontent.com/github/form-templates/refs/heads/main/.github/ISSUE_TEMPLATE/collaboration_ready_repository.pdf" rel="noopener noreferrer"&gt;this checklist&lt;/a&gt;, and use it to help guide you along each time you create (or revisit) a GitHub repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Get started&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Download &lt;a href="https://raw.githubusercontent.com/github/form-templates/refs/heads/main/.github/ISSUE_TEMPLATE/collaboration_ready_repository.pdf" rel="noopener noreferrer"&gt;this printable checklist&lt;/a&gt; that you can use to ensure that you’ve covered all aspects of making your repository collaboration-ready. Or, use this handy &lt;a href="https://github.com/github/form-templates#readme" rel="noopener noreferrer"&gt;Issue Template&lt;/a&gt; to create an updatable checklist right inside your own GitHub repository!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzdjfplerc6d1bs16rzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzdjfplerc6d1bs16rzd.png" alt="Collaboration-ready checklist" width="791" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>collaboration</category>
      <category>repository</category>
      <category>maintainers</category>
    </item>
    <item>
      <title>New year, new planning habits: using GitHub Projects to track your goals</title>
      <dc:creator>peckjon</dc:creator>
      <pubDate>Tue, 20 Feb 2024 17:24:13 +0000</pubDate>
      <link>https://dev.to/github/new-year-new-planning-habits-using-github-projects-to-track-your-goals-1meh</link>
      <guid>https://dev.to/github/new-year-new-planning-habits-using-github-projects-to-track-your-goals-1meh</guid>
      <description>&lt;p&gt;At the beginning of every year, I do the same thing: resolve to get myself fitter, learn a new language, and build out that awesome new side project. And at the &lt;em&gt;end&lt;/em&gt; of every year, I do the same thing: look back on my unfinished goals, and regret my failures. This year will be different. It's time to break the cycle, to build out specific and actionable plans, to itemize and track my progress… in other words, to do proper project management. And since my team lives in GitHub every day, I thought I'd use the opportunity to see if I can use &lt;a href="https://github.com/features/issues" rel="noopener noreferrer"&gt;GitHub Projects&lt;/a&gt; (the tool we use for all our planning and tracking) for my own self improvement, to manage my new year's resolutions!&lt;/p&gt;

&lt;p&gt;Getting started is always the most difficult part of any project, and while I could build out my project from scratch, I have the option of starting from a template instead. There are two kinds of templates to choose from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organization-level templates can be created by any org member with the right level of access. These are great for standardizing our project management practices, can be created from scratch or converted into a template from an existing project, can have &lt;a href="https://docs.github.com/en/issues/planning-and-tracking-with-projects/managing-your-project/managing-project-templates-in-your-organization" rel="noopener noreferrer"&gt;preconfigured views, workflows, custom fields&lt;/a&gt;, and more.&lt;/li&gt;
&lt;li&gt;Built-in templates, provided directly by GitHub, are a good starting point for generic projects. In this case, I don't need something that'll fit a specific organizational standard, and this is more of an ongoing planning project than a specific feature release, so I'm going to pick GitHub's "Team Planning" template and get started!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kdvdc932foaujduaae5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kdvdc932foaujduaae5.png" alt="Screenshot: selecting the " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even though this isn't a typical team-oriented project, it's clear that there are a lot of views and options that will be useful. But before I start exploring all the possibilities, I'll start by adding a few items to the project. Some of my new year's resolutions are conceptual, like "eat better" or "practice speaking Spanish", and they don't connect to any existing code or repositories. That's fine – GitHub Projects allow me to rapidly hand-enter any text and immediately turn it into an item!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9469ks9wy3z04rmfypy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9469ks9wy3z04rmfypy3.png" alt="Screenshot: the backlog view of a GitHub Project named " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, some of my resolutions are related to existing repositories that I'm already working on. For these, I have a few options. I can type '#' while adding an item to get a list of repositories I'm connected to, pick one, then select any issue or pull request to add.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ksk24bsnm7hiple0nqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ksk24bsnm7hiple0nqs.png" alt="Screenshot: adding an item to the backlog by selecting an issue from an existing repository" width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For ongoing projects, though, this will get tedious; I don't want to manually add every Issue in my repository. Fortunately, GitHub Projects has a concept of Workflows: flexible and graphically-configurable automation which can react to changes in items, related repositories, pull requests, and more. Among other options, this means I can easily configure a workflow to notice whenever an issue is created in my repository, and immediately add it to the project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcwopow92b5c0497mgx09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcwopow92b5c0497mgx09.png" alt="Screenshot: setting up a workflow to automatically add new issues from a repository to the project" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that I have a few items, I can start thinking about how I want to visualize my work. A Project can have as many different views as I want, each represented by a tab at the top. And each tab can have a different layout, "Board", "Table", or "Roadmap". The template I used has examples of each, the first being my Backlog, shown as a simple Kanban board. I'd like a little more granularity though, so I'll click the '+' to add another column.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foypo3ns3q5tcbkdg4utc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foypo3ns3q5tcbkdg4utc.png" alt="Screenshot: adding a new column to a view" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I could go a lot further with this, filtering items by type or label, &lt;a href="https://www.linkedin.com/posts/github_announcing-swimlanes-for-github-projects-activity-7090740528119480320-GThs" rel="noopener noreferrer"&gt;adding swimlanes&lt;/a&gt;, or even changing what field is used to define the columns. But for now, I'll simply drag a few items into my new "Up Next" column, then take a look at another view: "Team Capacity". This is a great example of using a Table layout to summarize information. By summing the effort estimates I've placed on each work item, then slicing the view by Assignee, I quickly see who might be overburdened and who has capacity for more tasks. In fact… there may be something I can offload to free up a bit of my own time! I bet my friend &lt;a class="mentioned-user" href="https://dev.to/geektrainer"&gt;@geektrainer&lt;/a&gt; has a decent salad recipe he's willing to share, so I'll click on that item and assign that to him. My view immediately updates to show the rebalanced tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0ssux1js367zqdefcgd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0ssux1js367zqdefcgd.png" alt="Screenshot: a table summarizing the workload on each team member in the project" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is great, but it's also just a single point-in-time. I know from experience that taking on all my resolutions at the same time will be a disaster (ask me sometime about the emotional load of taking on a new job while going keto during dry January)! Instead, I want to plan out my tasks over the next few months. For that, I'll use &lt;a href="https://docs.github.com/en/issues/planning-and-tracking-with-projects/understanding-fields/about-iteration-fields" rel="noopener noreferrer"&gt;Iterations&lt;/a&gt;, which allow me to create and assign named date ranges. I prefer thematically-named two-week sprints, so I'll use "Attitude" for Jan 1-14, "Balance" starting Jan 15, "Commitment" for the next, and so on. Clicking on the Roadmap tab, I can now easily visualize what I'll be working on this quarter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpca8324tfp404qkg6g73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpca8324tfp404qkg6g73.png" alt="Screenshot: project roadmap view with items on a timeline" width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are lots of ways I could keep improving this Project! I might want to…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add a new view (perhaps a "Triage" table to help me see new tasks that have just come in, then assign priority and effort estimates)&lt;/li&gt;
&lt;li&gt;create some new custom fields containing text, numbers, or a list of options (e.g. a "focus area" with options "social", "emotional", "physical")&lt;/li&gt;
&lt;li&gt;add column limits so I'm not overwhelmed with too many items at once&lt;/li&gt;
&lt;li&gt;create custom filters so each of my collaborators has a personalized view&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for now, I want to help ensure I stay on track, and one of the best ways to do so is to make my efforts publicly visible. By inviting a few friends to my project, I can take advantage of a great new feature: &lt;a href="https://github.blog/changelog/2024-01-18-github-issues-projects-project-status-updates-issues-side-panel/" rel="noopener noreferrer"&gt;status updates&lt;/a&gt;. First, in my project's settings, I'll click into "manage access" and invite &lt;a class="mentioned-user" href="https://dev.to/scubaninja"&gt;@scubaninja&lt;/a&gt; – she's great at motivating me to get work done!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcycsd2fdz0cipb3y5pjy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcycsd2fdz0cipb3y5pjy.png" alt="Screenshot: inviting a collaborator into the project" width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While collaborators can always choose to get notifications about individual issues if they desire, I want to go beyond this with regular, handwritten summaries. I'll treat this a bit like a newsletter or point-in-time update on the project. While there's no set format for updates, I can use rich formatting and generally will want to include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;high level details about how the project is currently going&lt;/li&gt;
&lt;li&gt;any relevant KPIs/metrics&lt;/li&gt;
&lt;li&gt;details on any recent successes or misses&lt;/li&gt;
&lt;li&gt;celebration of contributors' work (using '@' mentions)&lt;/li&gt;
&lt;li&gt;potential risks or upcoming challenges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc16g73y7d21ghm8lmyi3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc16g73y7d21ghm8lmyi3.png" alt="Screenshot: adding a status update to the project" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This exercise has been great for kicking off my own personal goals, but I'm even more excited to see how teams everywhere will use GitHub to initiate, standardize, maintain, and iterate on their collaborative projects. Whether you're just beginning, migrating from another project planning platform, or investigating our newest features, I urge you to try creating and using &lt;a href="https://docs.github.com/en/issues/planning-and-tracking-with-projects/managing-your-project/managing-project-templates-in-your-organization" rel="noopener noreferrer"&gt;organizational templates&lt;/a&gt;, adding a &lt;a href="https://docs.github.com/en/issues/planning-and-tracking-with-projects/managing-your-project/adding-your-project-to-a-repository" rel="noopener noreferrer"&gt;project to your existing repositories&lt;/a&gt;, and &lt;a href="https://docs.github.com/en/issues/planning-and-tracking-with-projects/customizing-views-in-your-project" rel="noopener noreferrer"&gt;customizing your existing projects&lt;/a&gt; to include new views and &lt;a href="https://docs.github.com/en/issues/planning-and-tracking-with-projects/understanding-fields" rel="noopener noreferrer"&gt;custom fields&lt;/a&gt;. With the power of GitHub Projects at your fingertips, you'll be crushing it in no time. &lt;a href="https://docs.github.com/en/issues/planning-and-tracking-with-projects" rel="noopener noreferrer"&gt;Get started&lt;/a&gt; today!&lt;/p&gt;

</description>
      <category>github</category>
      <category>projectmanagement</category>
      <category>team</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
