<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="">
  <meta name="author" content="">
  <link rel="icon" href="assets/icon.png">

  <title>PiGallery 2</title>

  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
        integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
  <link rel="stylesheet" href="style.css">
  <link rel="stylesheet" href="gh-fork-ribbon.min.css">
  <!-- Global site tag (gtag.js) - Google Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-131201011-1"></script>
  <script>
    window.dataLayer = window.dataLayer || [];

    function gtag() {
      dataLayer.push(arguments);
    }

    gtag('js', new Date());

    gtag('config', 'UA-131201011-1');
  </script>
  <!-- Place this tag in your head or just before your close body tag. -->
  <script async defer src="https://buttons.github.io/buttons.js"></script>
</head>

<body class="text-center">
<a class="github-fork-ribbon" href="https://github.com/bpatrik/pigallery2" data-ribbon="Fork me on GitHub"
   title="Fork me on GitHub">Fork me on GitHub</a>
<div class="cover-container d-flex w-100 h-100 p-3 mx-auto flex-column ">
  <header class="masthead">
    <div class="inner">
      <h3 class="masthead-brand">
        <img src="assets/icon_inv.png" width="30" height="30" class="d-inline-block align-top"
             alt=""> PiGallery 2
      </h3>
      <nav class="nav nav-masthead justify-content-center">
        <a class="nav-link active" href="index.html">Features</a>
        <a class="nav-link" href="https://github.com/bpatrik/pigallery2">Install</a>
      </nav>
    </div>
  </header>

  <main class="content">
    <div class="row">
      <div class="col">
        <h3>
          PiGallery 2 is a self-hosted directory-first photo gallery website.
        </h3>
        <a href="https://pigallery2.onrender.com/">Try our live demo! <span class="small">(First load may take up 60s, while the server boots up)</span></a>

      </div>

    </div>
    <div class="github-button-wrapper">
      <!-- Place this tag where you want the button to render. -->
      <a class="github-button" href="https://github.com/bpatrik/pigallery2" data-size="large" data-icon="octicon-star"
         data-show-count="true" aria-label="Star bpatrik/pigallery2 on GitHub">Star</a>
      <!-- Place this tag where you want the button to render. -->
      <a class="github-button" href="https://github.com/bpatrik/pigallery2/fork" data-size="large"
         data-icon="octicon-repo-forked"
         data-show-count="true" aria-label="Fork bpatrik/pigallery2 on GitHub">Fork</a>
    </div>
    <img class="banner-photo" src="assets/main_page.png" style="width: 100%">
    <div class="row">
      <div class="col">
        The gallery is a directory first gallery. It renders your read-only directory structure as it is.
        Supports rich search queries and fully <a href="https://www.docker.com/">dockerized</a>.
      </div>
    </div>
    <h3 class="section-header">Main features:</h3>
    <hr/>


    <div class="row feature">
      <div class="col-12 col-md-8 feature-image">
        <img src="assets/lightbox.png" style="width: 100%">
      </div>
      <div class="col order-md-1">
        <h3>Photo viewer</h3>
        Nice photo viewer with optional information panel that shows all important information about the photo.
      </div>
    </div>

    <div class="row feature">
      <div class="col-12 col-md-8  feature-image">
        <img src="assets/map.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Map</h3>
        PiGallery2 reads the location data of the photos and puts them on a nice map.
        It by default supports <a href="https://www.openstreetmap.org">OpenStreetMap</a> and <a
        href="https://www.mapbox.com">Mapbox</a>, but you can also add you own favourite map provider.
        The gallery also supports *.gpx file to show your tracked path on the map too.
        It recognize different type of activities (like: running, flying) from the *.gpx files.
        The app shows these activities with different color and icon on the map.
      </div>
    </div>

    <div class="row feature">
      <div class="col-12 col-md-8  feature-image">
        <img src="assets/search.png">
      </div>
      <div class="col">
        <h3>Advanced searching</h3>
        App supports full <a href="https://en.wikipedia.org/wiki/Boolean_algebra">boolean logic</a> with negation and
        exact or wildcard search.
        It also provides handy suggestions with autocomplete.
        <p/>

        <h5>Match types</h5>
        <code class="code-block p-2 text-light rounded bg-secondary d-block">
          person:"John" # exact match <br/>
          person:(John) # wildcard match <br/>
          person:John # same as person:(John) <br/>
          person!:John # negation
        </code>


      </div>
    </div>
    <div class="row feature">
      <div class="col">
        <h5>Supported keywords</h5>
        <code class="code-block p-2 text-light rounded bg-secondary d-block">

          after:2020<br/>
          before:2021<br/>
          orientation:portrait<br/>
          orientation:landscape<br/>
          max-rating:1<br/>
          max-rating:5<br/>
          min-resolution:1<br/>
          max-resolution:10<br/>
          min-faces:1<br/>
          max-faces:10<br/>

          keyword:"house"<br/>
          caption:"caption"<br/>
          directory:"dir name/another dir"<br/>
          file_name:"img.jpg",<br/>
          person:"John",<br/>
          position:"USA" # use city, state, country names<br/>
          5-km-from:(New York) # photos 5 km from the center of New York <br/>
          any_text:"apple", # searches for apple everywhere, "any_text:" can be omitted <br/>
          last-4-days:every-week <br/>
          last-4-days:every-month <br/>
          last-4-days:every-year <br/>
          last-4-days:2-days-ago <br/>
          last-4-days:2-weeks-ago <br/>
          last-4-days:2-months-ago <br/>
          last-4-days:2-years-ago <br/>
        </code>
        See all here: <a
        href="https://github.com/bpatrik/pigallery2/blob/5368b4ed4e1a61097dbc88aa076aaf9c21524a8d/src/frontend/app/ui/gallery/search/search-query-parser.service.ts#L9">search-query-parser.service.ts</a>.
        <p/>
        <h5>Bool expressions</h5>
        <code class="code-block p-2 text-light rounded bg-secondary d-block">
          John and Kate # photos with "John" and "Kate" (any string match) <br/>
          John Kate # same as "John and Kate" <br/>
          John or Kate # photos with "John" or "Kate" (any string match) <br/>
          2-of:(John, Kate, Steve) # lists photos that satisfies at least 2 out of the 3 names (any string match)
        </code>
        <p/>
        <h5>Sort order</h5>
        Add an empty file like <code
        class="code-block p-1 text-light rounded bg-secondary">.order_[ORDER].pg2conf</code>
        to a folder to override the default sorting for that folder.
        It's not recursively applied to subfolders.<br/>
        Replace <code class="code-block p-1 text-light rounded bg-secondary">[ORDER]</code> in the above shown filename
        by one of the following values:<br/>
        <code class="code-block p-2 text-light rounded bg-secondary d-block">
          descending_name<br/>
          ascending_name<br/>
          descending_date<br/>
          ascending_date<br/>
          random<br/>
        </code>
      </div>
    </div>


    <div class="row feature">
      <div class="col-12 col-md-8   feature-image">
        <img src="assets/sharing.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Sharing</h3>
        You can share your photo folders with your friends.
        The sharing link can be also password protected.
        Limitations: you cannot share search results.
      </div>
    </div>


    <div class="row feature">
      <div class="col-12 col-md-8  feature-image">
        <img src="assets/video.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Video playback</h3>
        It also supports *.mp4, *.webm, *.ogv and *.ogg files.
      </div>
    </div>


    <div class="row feature">
      <div class="col-12 col-md-8  feature-image">
        <img src="assets/filters.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Local filters</h3>
        Rich filter panel, where you can further filter your directory or search results.
      </div>
    </div>


    <div class="row feature">
      <div class="col-12 col-md-8   feature-image">
        <img src="assets/blog.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Blog</h3>
        You can add *.md files to your directory and app will show them.
        You can tag section in the *.md files with <code class="code-block">&lt;!-- @pg-date &lt;ISO_DATE> --></code>,
        like: <code class="code-block">&lt;!-- @pg-date 2015-06-29 --></code> to attach them to a date.
        Then, if you group by date, they will show up at the assigned day.
      </div>
    </div>

    <div class="row feature">
      <div class="col-12 col-md-8  feature-image">
        <img src="assets/albums.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Logical Albums</h3>
        You can create logical albums (a.k.a.: Saved search) from any search query.
        Current limitation: It is not possible to create albums from a manually picked photos.
      </div>
    </div>


    <div class="row feature">
      <div class="col-12 col-md-8  feature-image">
        <img src="assets/faces.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Faces</h3>
        PiGallery2 can read face reagions from photo metadata.
        Current limitation: No ML-based, automatic face detection.
      </div>
    </div>


    <div class="row feature">
      <div class="col-12 col-md-8  feature-image">
        <img src="assets/random_link.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Random link</h3>
        You can create a link that will serve a random photo from your gallery.
        You can use this link with 3rd party applications, like with an automatic wallpaper changer gadget.
      </div>
    </div>


    <div class="row feature">
      <div class="col-12 col-md-8  feature-image">
        <img src="assets/settings.png" style="width: 100%">
      </div>
      <div class="col">
        <h3>Rich settings</h3>
        PiGallery2 has a rich settings page where you can easily set up the gallery.
        <a href="https://pigallery2.onrender.com/admin">Click here to see all the setting in the live demo.</a>
      </div>
    </div>

    <h3 class="section-header">All features:</h3>
    <hr/>
    <ul class="text-start">
      <li>supported formats:
        <ul>
          <li>images: <strong>jpg, jpeg, jpe, webp, png, gif, svg</strong></li>
          <li>videos: <strong>mp4, ogg, ogv, webm</strong></li>
        </ul>
      </li>
      <li><strong>Rendering directories as it is</strong>
        <ul>
          <li>Listing subdirectories recursively</li>
          <li>Listing photos in a nice grid layout
            <ul>
              <li>supporting most common image formats</li>
              <li>showing <strong>tag/keywords, locations, GPS coordinates</strong> for photos</li>
              <li>rendering photos on demand (on scroll)</li>
            </ul>
          </li>
        </ul>
      </li>
      <li><strong>On the fly thumbnail generation</strong> in several sizes
        <ul>
          <li>prioritizes thumbnail generation (generating thumbnail first for the visible photos)</li>
          <li>saving generated thumbnails to TEMP folder for reuse</li>
          <li>supporting several core CPU</li>
          <li>supporting hardware acceleration (<a href="https://github.com/lovell/sharp">sharp</a>)
          </li>
        </ul>
      </li>
      <li>Custom lightbox for full screen photo and video viewing
        <ul>
          <li>keyboard support for navigation</li>
          <li>showing low-res thumbnail while full image loads</li>
          <li>Information panel for showing <strong>Exif info</strong></li>
          <li>Automatic playing</li>
          <li>gesture support (swipe left, right, up)</li>
          <li>shortcut support</li>
        </ul>
      </li>
      <li>Client side caching (directories and search results)</li>
      <li>Rendering <strong>photos</strong> with GPS coordinates <strong>on open street map</strong>
        <ul>
          <li>.gpx file support: rendering paths to map</li>
          <li>supports OSM and Mapbox by default, but you can add any provider that has a tile url</li>
        </ul>
      </li>
      <li> Indexes Gallery to DB for a snappy user experience
        <ul>
          <li>Both MySQL and SQLite support</li>
        </ul>
      </li>
      <li>Faces (persons) support
        <ul>
          <li>reads Adobe's XMP Face region metadata. (It is defined by the Metadata Working Group (MWG).)</li>
        </ul>
        <ul>
          <li>shows face bounding box over images</li>
        </ul>
      </li>
      <li>internalization / translation support</li>
      <li>Nice design
        <ul>
          <li>responsive design (phone, tablet desktop support)</li>
        </ul>
      </li>
      <li>Setup page</li>
      <li>Random photo url
        <ul>
          <li>You can generate an url that returns a random photo from your gallery. You can use this feature to develop
            3rd party applications, like: changing desktop background
          </li>
        </ul>
      </li>
      <li>video support
        <ul>
          <li>fully supports <em>.mp4 files and partially (might have errors with safari and IE) supports </em>.ogg,
            <em>.ogv, </em>.webm files
          </li>
          <li>uses ffmpeg and ffprobe to generate video thumbnails</li>
          <li>can transcode videos to mp4 for better support</li>
        </ul>
      </li>
      <li>Markdown based blogging support
        <ul>
          <li>You can write some note in the *.md files for every directory</li>
        </ul>
      </li>
      <li>job scheduling support, with the following supported task <a
        href="https://github.com/bpatrik/pigallery2/issues/92">#92</a>
        <ul>
          <li>converting/transcoding videos</li>
          <li>indexing db</li>
          <li>etc..</li>
        </ul>
      </li>
      <li>.pg2conf UI modifying files. <a
        href="https://github.com/bpatrik/pigallery2/issues/177">#177</a>
        <ul>
          <li>List of these files are passed down to the UI modify its behaviour.</li>
          <li>Currently, supported custom, per folder sorting.</li>
        </ul>
      </li>
      <li>Dockerized</li>
    </ul>

    <hr/>

    <p>Fork me on GitHub ribbon provided by <a href="https://github.com/simonwhitaker/github-fork-ribbon-css">simonwhitaker</a>
    </p>

  </main>

</div>


<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
        integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
        crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
        integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
        crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
        integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
        crossorigin="anonymous"></script>

</body>
</html>