πŸ“· Yet another photo management app for Nextcloud

Overview

Memories

πŸ“· Yet another photo management app for Nextcloud

Screenshot

How is this different?

  • πŸ“Έ Photo and Video Timeline: Sorts photos by date taken, parsed from Exif data.
  • πŸ€” Quick Recap: Jump to anywhere in the timeline instantly.
  • πŸ–ΌοΈ Folders: Browse your and shared folders with a similar, efficient timeline.
  • 🎦 Slideshow: View photos from your timeline and folders easily.
  • πŸ“± Mobile Support: Relive your memories on devices of any shape and size through the web app.
  • πŸ—‘οΈ Recycle: Select and delete multiple photos and videos at once.
  • ⚑️ Fast: Memories is extremely fast. Period. More details below.

πŸš€ Installation

  1. Install the app from the Nextcloud app store
  2. βš’οΈ Install exiftool (see below).
  3. Run php ./occ memories:index to generate metadata indices for existing photos.
  4. Open the πŸ“· Memories app in Nextcloud and set the directory containing your photos. Photos from this directory will be displayed in the timeline, including any photos in nested subdirectories.
  5. Installing the preview generator for pre-generating thumbnails is strongly recommended.

πŸ”¨ Installing Dependencies

The exact steps depend on your Nextcloud platform. If you use Docker for your Nextcloud instance, you can install Exiftool by using a custom docker image.

  • Ubuntu/Debian: sudo apt install libimage-exiftool-perl
  • Fedora: sudo dnf install perl-Image-ExifTool
  • Arch Linux: sudo pacman -S perl-image-exiftool
  • Alpine: apk add --no-cache exiftool
  • MacOS: brew install exiftool
  • FreeBSD: sudo pkg install p5-Image-ExifTool

πŸ— Development setup

  1. ☁ Clone this into your apps folder of your Nextcloud.
  2. πŸ‘©β€πŸ’» In a terminal, run the command make dev-setup to install the dependencies.
  3. πŸ— Then to build the Javascript whenever you make changes, run make build-js. To create a pull request use make build-js-production. Watch changes with: make watch-js.
  4. βœ… Enable the app through the app management of your Nextcloud.
  5. πŸŽ‰ Partytime!

πŸ€” Why a separate app?

The approach of this app is fundamentally different from the official Nextcloud Photos app, which is very lightweight and works entirely using webdav. This app instead maintains special metadata in a separate table on the backend, and thus can be considered to have different objectives.

⚑ Performance

  • Once properly configured, Memories is extremely fast, possibly one of the fastest web photo viewers.
  • On a server with relatively cheap hardware (Intel Pentium G6400 / 8GB RAM / SSD), loading the timeline takes only ~400ms without cache on a laptop (Intel Core i5-1035G1 / Windows 11 / Chrome) for a library of ~17000 photos totaling 100GB. The test was performed on Nextcloud 24 with nginx, php-fpm and mariadb running in Docker.
  • For best performance, install the preview generator and make sure HTTP/2 is enabled for your Nextcloud instance.

πŸ“ Notes

  • You may need to configure the Nextcloud preview generator and Imagemagick / ffmpeg to support all types of images and videos (e.g. HEIC). If using the official docker image, add OC\Preview\HEIC to enabledPreviewProviders in your config.php.
  • If local time is not found in the photo (especially for videos), the server timezone is used.
  • The app can work with external storage for photos.
    • The photos in the external storage needs to be at the same relative path that is configured for the timeline. For example, if your storage is mounted as /External/ and your photos are in /External/MyPhotos/, then you need to configure the timeline to be MyPhotos/. This will look for MyPhotos/ in all external storages as well as your root home directory, and aggregate these photos.
    • You also need to set up a cron job for the index command if you:
      • Use the same timeline for multiple users.
      • Delete and restore files from the external storage.
    • If you add any photos from outside Nextcloud, you must run the scan and index commands.
    • Indexing may be slow, since all files must be downloaded from the storage. The app currently assumes that the Exif data is present with the first 20MB of each file.
    • This function is experimental and may not work as expected. Please report any issues.

Special Thanks

Nextcloud team. At least one half of the code is based on the work of the Nextcloud Photos.

Comments
  • 503 on /memories/api/faces

    503 on /memories/api/faces

    Used to work fine & super fast last night, all i did in the meantime was updating memories and recognize, then did a memories:index. Now it stays at pending, then times out, no errors/warning in the log, latest version. Everything else loads instantly.

    Once i open the people tab i see 2 mariadb threads stuck at 94% cpu, otherwise system load is low, lots of free resources

    Photos/people works, although uses extreme amounts of cpu and memory clientside, even on a high end system, due to its bad implementation. It just freezes after a few hundred faces and then the browser dies a painful death

    MariaDB [nextcloud]> select count(*) from oc_recognize_face_detections;
    +----------+
    | count(*) |
    +----------+
    |    36632 |
    +----------+
    1 row in set (0.005 sec)
    
    MariaDB [nextcloud]> select count(*) from oc_recognize_face_clusters;
    +----------+
    | count(*) |
    +----------+
    |     4475 |
    +----------+
    1 row in set (0.001 sec)
    
    bug priority: max performance 
    opened by illnesse 46
  • Please install exiftool (at least v12) and make sure it is in the PATH

    Please install exiftool (at least v12) and make sure it is in the PATH

    I'm getting this error when I launch occ memories:index

    Running Nextcloud on Docker macos (Macmini M1)

    I did run:

    brew install exiftool

    WARN: Failed to create stay_open exiftool process Exiftool timeout for file stream: Could not read exif data Couldn't read Exif data from test file: Could not read from Exiftool FATAL: exiftool could not be found or test failed Please install exiftool (at least v12) and make sure it is in the PATH

    invalid 
    opened by smailpouri 21
  • Syntax Error when enabling Memories app

    Syntax Error when enabling Memories app

    I've followed the installation instructions, but when trying to run the index occ command, I'm getting a syntax error:

    sudo -u www-data php /var/www/nextcloud/occ apps:memories
    An unhandled exception has been thrown:
    ParseError: syntax error, unexpected ')', expecting '|' or variable (T_VARIABLE) in /var/www/nextcloud/apps/memories/lib/Db/TimelineWrite.php:58
    Stack trace:
    #0 /var/www/nextcloud/lib/composer/composer/ClassLoader.php(428): Composer\Autoload\includeFile()
    #1 [internal function]: Composer\Autoload\ClassLoader->loadClass()
    #2 /var/www/nextcloud/apps/memories/lib/Command/Index.php(79): spl_autoload_call()
    #3 [internal function]: OCA\Memories\Command\Index->__construct()
    #4 /var/www/nextcloud/lib/private/AppFramework/Utility/SimpleContainer.php(108): ReflectionClass->newInstanceArgs()
    #5 /var/www/nextcloud/lib/private/AppFramework/Utility/SimpleContainer.php(116): OC\AppFramework\Utility\SimpleContainer->buildClass()
    #6 /var/www/nextcloud/lib/private/AppFramework/Utility/SimpleContainer.php(133): OC\AppFramework\Utility\SimpleContainer->resolve()
    #7 /var/www/nextcloud/lib/private/AppFramework/DependencyInjection/DIContainer.php(465): OC\AppFramework\Utility\SimpleContainer->query()
    #8 /var/www/nextcloud/lib/private/ServerContainer.php(145): OC\AppFramework\DependencyInjection\DIContainer->queryNoFallback()
    #9 /var/www/nextcloud/lib/private/Console/Application.php(217): OC\ServerContainer->query()
    #10 /var/www/nextcloud/lib/private/Console/Application.php(128): OC\Console\Application->loadCommandsFromInfoXml()
    #11 /var/www/nextcloud/console.php(99): OC\Console\Application->loadCommands()
    #12 /var/www/nextcloud/occ(11): require_once('/var/www/nextcl...')
    #13 {main}user@hostname:/var/www/nextcloud/apps#
    

    This syntax error throws an internal server error in nextcloud which prevents all nextcloud access: image

    opened by meichthys 21
  • Memories not going through subfolders

    Memories not going through subfolders

    Hi there,

    I am running Nextcloud 25 Stable, on Apache 2.4.38, with MariaDB and SMB mounted drive for the Data directory. I have Auto-Upload activated on my smartphone and set to store pictures in subfolders for years and month. IE: photo taken on 2022-10-29, will be in the folder: Auto-Upload/2022/10/Pics.jpeg I installed Memories 4.4.1 and updated yesterday to 4.5.1. I ran ./occ memories:index right after the first install and ran it again after 4.5.1 update.

    On either versions, Memories only show me something in the Timeline if I select a month folder (ie: a folder that has pics directly in it). Nothing shows if I select Auto-Upload or Auto-Upload/YYYY.

    My understanding was that Memories should look in subfolders, looking at the Github project page, it does say: "Photos from this directory will be displayed in the timeline, including any photos in nested subdirectories."

    Am I doing something wrong? Do I need to put a single picture in each of the YYYY and MM folders to make it go through?

    bug priority: max 
    opened by elr3m 20
  • Would you accept a pull request for Face Recognition integration?

    Would you accept a pull request for Face Recognition integration?

    First of all, thank you very much for the application. Love it. πŸ˜„

    On the other hand, I develop an unofficial facial recognition application for Nextcloud.

    • https://github.com/matiasdelellis/facerecognition

    It has much more development, but it will never be accepted as an official part since they prefer the automatic approach beyond the quality of the results, but I don't want to make a controversy about it either. I am writing here to see if you would be willing to accept a PR adding support for this application.

    Now i'm doing tests, just modifying the backend queries to reuse the frontend.

    imagen imagen

    However ideally i should add a new (and hidden by default) view, since the way it works is different (It is oriented to the faces, to avoid errors). imagen

    feature priority: high 
    opened by matiasdelellis 18
  • Faces list performance

    Faces list performance

    You obviously seem to have an eye on performance, maybe give the faces list some love too? It takes quite a while to load and behaves rather sluggish when done. It would probably involve writing thumbnail files for the faces to avoid transform css (and loading a rather large image for each cluster, i have 300+ so far, still going), so maybe that would be better handled in recognize? Or maybe use canvas to only draw the specific region of an image? Still not as fast as thumbnail files and not cache-able i guess.

    bug 
    opened by illnesse 17
  • 4.7.1 not showing meta data in the EXIF tab

    4.7.1 not showing meta data in the EXIF tab

    I was pretty excited when I saw the preview of the EXIF view some days ago. In 4.7.1 the EXIF tab is there ... but the EXIF data is missing.

    Picture in the Memories view:

    image

    The same in the folder view:

    image

    I re-did an occ memories:index but it told me it had nothing to do ... is this a bug or what's missing?

    need details 
    opened by jacotec 15
  • HEVC Live videos don't play

    HEVC Live videos don't play

    The live photos feature has made Memories so much more usable (No more duplicate photo/videos!). πŸ‘

    It doesn't bother me much, but i did notice that the live video doesn't seem to play when clicking on (or hovering) over the live video icon. I do see the following in the console logs:

    Media resource https://nextcloud.mydomain.com/apps/memories/api/video/livephoto/611885?etag=38076727bb7da1dad8b958ec937f19ee&liveid=CAF8D2E2-2B80-46D1-8E6B-31742E3E241F could not be decoded. [memories](https://nextcloud.mydomain.com/apps/memories/)
    Media resource https://nextcloud.mydomain.com/apps/memories/api/video/livephoto/611885?etag=38076727bb7da1dad8b958ec937f19ee&liveid=CAF8D2E2-2B80-46D1-8E6B-31742E3E241F could not be decoded, error: Error Code: NS_ERROR_DOM_MEDIA_DEMUXER_ERR (0x806e000c)
    Details: virtual RefPtr<MP4Demuxer::InitPromise> mozilla::MP4Demuxer::Init(): No MP4 audio () or video () tracks
    
    bug priority: high 
    opened by meichthys 14
  • People Page emtpy

    People Page emtpy

    image

    My NAS (which is the external storage for all photos) went down some time ago, after remount & rebooting the nextcloud container the People tab in Memories was empty. I tried running files:scan and memories:index (index needed a full rebuild apparently), still nada. Might be a recognize problem as it was spitting lots of div by zero errors during that time

    opened by illnesse 14
  • Use exif data if available instead of file timestamp

    Use exif data if available instead of file timestamp

    Although discussed in https://github.com/pulsejet/memories/issues/30#issuecomment-1246648517 , it's a separate issue.

    Nextcloud handles file timestamp in an inconsistent way depending on when/how the file got indexed or uploaded. EXIF metadata on photos, instead, should be pretty stable from the moment the picture was taken. The app could use the EXIF date/time data in its Timeline sorting function if it is available. of course, reverting to the file timestamp is fine if EXIF data is unavailable or invalid.

    This probably should be labeled an Improvement request since it's not a bug really.

    need details 
    opened by Aquariu 14
  • Video playback in timeline not working with external folder

    Video playback in timeline not working with external folder

    At first my server was really busy after giving the command for video setup. After that, it almost instantly gave a [Object] [object] response and video playback isn't working.

    Log: {"reqId":"ylwRhPwRX9ovGR56yVP7","level":0,"time":"2022-11-15T19:36:09+00:00","remoteAddr":"#REMOTEADDRESS","user":"#USER","app":"occweb","method":"POST","url":"/apps/occweb/cmd","message":"memories:video-setup","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36","version":"25.0.1.1","data":{"app":"occweb"}}

    {"reqId":"ylwRhPwRX9ovGR56yVP7","level":3,"time":"2022-11-15T19:36:09+00:00","remoteAddr":"#REMOTEADDRESS","user":"#USER","app":"index","method":"POST","url":"/apps/occweb/cmd","message":"trim(): Argument #1 ($string) must be of type string, bool given in file '/config/www/nextcloud/apps/memories/lib/Command/VideoSetup.php' line 122","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36","version":"25.0.1.1","exception":{"Exception":"Exception","Message":"trim(): Argument #1 ($string) must be of type string, bool given in file '/config/www/nextcloud/apps/memories/lib/Command/VideoSetup.php' line 122","Code":0,"Trace":[{"file":"/config/www/nextcloud/lib/private/AppFramework/App.php","line":172,"function":"dispatch","class":"OC\\AppFramework\\Http\\Dispatcher","type":"->"},{"file":"/config/www/nextcloud/lib/private/Route/Router.php","line":298,"function":"main","class":"OC\\AppFramework\\App","type":"::"},{"file":"/config/www/nextcloud/lib/base.php","line":1047,"function":"match","class":"OC\\Route\\Router","type":"->"},{"file":"/config/www/nextcloud/index.php","line":36,"function":"handleRequest","class":"OC","type":"::"}],"File":"/config/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php","Line":165,"Previous":{"Exception":"TypeError","Message":"trim(): Argument #1 ($string) must be of type string, bool given","Code":0,"Trace":[{"file":"/config/www/nextcloud/apps/memories/lib/Command/VideoSetup.php","line":122,"function":"trim"},{"file":"/config/www/nextcloud/3rdparty/symfony/console/Command/Command.php","line":255,"function":"execute","class":"OCA\\Memories\\Command\\VideoSetup","type":"->"},{"file":"/config/www/nextcloud/3rdparty/symfony/console/Application.php","line":1009,"function":"run","class":"Symfony\\Component\\Console\\Command\\Command","type":"->"},{"file":"/config/www/nextcloud/3rdparty/symfony/console/Application.php","line":273,"function":"doRunCommand","class":"Symfony\\Component\\Console\\Application","type":"->"},{"file":"/config/www/nextcloud/3rdparty/symfony/console/Application.php","line":149,"function":"doRun","class":"Symfony\\Component\\Console\\Application","type":"->"},{"file":"/config/www/nextcloud/lib/private/Console/Application.php","line":213,"function":"run","class":"Symfony\\Component\\Console\\Application","type":"->"},{"file":"/config/www/nextcloud/apps/occweb/lib/Controller/OccController.php","line":59,"function":"run","class":"OC\\Console\\Application","type":"->"},{"file":"/config/www/nextcloud/apps/occweb/lib/Controller/OccController.php","line":75,"function":"run","class":"OCA\\OCCWeb\\Controller\\OccController","type":"->"},{"file":"/config/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php","line":225,"function":"cmd","class":"OCA\\OCCWeb\\Controller\\OccController","type":"->"},{"file":"/config/www/nextcloud/lib/private/AppFramework/Http/Dispatcher.php","line":133,"function":"executeController","class":"OC\\AppFramework\\Http\\Dispatcher","type":"->"},{"file":"/config/www/nextcloud/lib/private/AppFramework/App.php","line":172,"function":"dispatch","class":"OC\\AppFramework\\Http\\Dispatcher","type":"->"},{"file":"/config/www/nextcloud/lib/private/Route/Router.php","line":298,"function":"main","class":"OC\\AppFramework\\App","type":"::"},{"file":"/config/www/nextcloud/lib/base.php","line":1047,"function":"match","class":"OC\\Route\\Router","type":"->"},{"file":"/config/www/nextcloud/index.php","line":36,"function":"handleRequest","class":"OC","type":"::"}],"File":"/config/www/nextcloud/apps/memories/lib/Command/VideoSetup.php","Line":122},"CustomMessage":"--"}}

    bug 
    opened by keesfluitman 13
  • Add move to folder feature

    Add move to folder feature

    I've been looking for a 'perfect' self hosted gallery app for some time, and this is the best I could find so far. So thanks for this project!

    While I am using this app though, I notice couple of features fell short, which are important for my use-case. So moving multiple photos from timeline and folders to another folder is the one I need at the moment (effectively fixes #204 - only move part though). So I decided to implement this. I understand that if this won't be prioritized (I'll use my fork anyway πŸ˜„) or cancelled all together.

    Couple of notes:

    • Webdav natively supports MOVE, so just using it as similar to Nextcloud files.
    • If the target exists, it'll fail. (again, same behavior with Nextcloud files).
    • Not enabling move in albums and archive as it would probably be doing something that user didn't intend.
    • Not adding move operation to context menu of photo view as that doesn't seem very useful (at least to me) so didn't want to add unnecessary noise.
    • Using very similar approaches to adding to album and deleting photos.
    opened by ahaltindis 0
  • Sidebar not displaying from album view

    Sidebar not displaying from album view

    Nextcloud version: 25.0.2 docker Ubuntu 22.04 Memories version: 4.9.3 Browser: tested with latest chromium, latest firefox on windows and latest samsung browser on Android.

    Description: Side bar (little icon with a circled i) is not displaying anything when the image is loaded from an album. The sidebar does display properly when using same image from timeline view. I tested several images and several account on different browser with same result.

    opened by NablaMetal 0
  • index creation leaks temp files

    index creation leaks temp files

    Hi,

    idk how to dig into this but I have an issue on my installation, where occ memories:index creates temp files, it seems for files on external storage, which it then does not clean up after itself... I only found this out because they filled up my root fs eventually, making almost everything else on my machine come to a halt and it took me a while to find that out because I wasn't expecting that πŸ˜…

    aaanyway, maybe I'm barking up the wrong tree here and it's on the remote storage implementation in nextcloud - idk... I'd consider myself a rather technical user but I'm not at all familiar with the NC architecture or codebase so if you can give me some pointers, I can help getting to the root of this... it's really bad though so it'd be nice to find a solution for this (also betcause that fs is on an SSD which gets absolutely tortured by this)

    Cheers

    opened by luxifr 3
  • Documentation issue

    Documentation issue

    To index videos also, I installed ffmpeg and added the entry for enabledPreviewProviders to the config.php as descibed here:

    https://github.com/pulsejet/memories/wiki/File-Type-Support

    This does not work and renders the Nextcloud instance unusable - due to an PHP syntax error.

    It took me a while to figure out that

    'enabledPreviewProviders' =>
      array (
        'OC\\Preview\\Movie',
        'OC\\Preview\\MKV',
        'OC\\Preview\\MP4',
        'OC\\Preview\\AVI',
      ),
    

    actually works - at least marking mp4 webm and mpeg as "supported".

    I'm not so much into PHP but the code sequence in the documentation above looks strange to me. I use PHP 8.1

    opened by beccon4 0
  • Use mkdir -p instead of mkdir --parents

    Use mkdir -p instead of mkdir --parents

    Hey, thanks for creating this great app.

    When I tried to set up a development environment on MacOS, I received the error mkdir: illegal option -- - from the make command. This is because the long form parameters for mkdir are not available on MacOS. I believe the -p option is more widely available.

    opened by ahaltindis 0
  • Required node version appears to actually be ^16.0.0

    Required node version appears to actually be ^16.0.0

    Per the output of npm ci via make dev-setup, several dependencies seem to expect v16 rather than the v14 specified in package.json:

    $ make dev-setup rm -f js/* rm -rf node_modules npm ci npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@nextcloud/[email protected]', npm WARN EBADENGINE required: { node: '^16.0.0', npm: '^7.0.0 || ^8.0.0' }, npm WARN EBADENGINE current: { node: 'v14.21.2', npm: '7.24.2' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@nextcloud/[email protected]', npm WARN EBADENGINE required: { node: '^16.0.0', npm: '^7.0.0 || ^8.0.0' }, npm WARN EBADENGINE current: { node: 'v14.21.2', npm: '7.24.2' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@nextcloud/[email protected]', npm WARN EBADENGINE required: { node: '^16.0.0', npm: '^7.0.0 || ^8.0.0' }, npm WARN EBADENGINE current: { node: 'v14.21.2', npm: '7.24.2' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@nextcloud/[email protected]', npm WARN EBADENGINE required: { node: '^16.0.0', npm: '^7.0.0 || ^8.0.0' }, npm WARN EBADENGINE current: { node: 'v14.21.2', npm: '7.24.2' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@nextcloud/[email protected]', npm WARN EBADENGINE required: { node: '^16.0.0', npm: '^7.0.0 || ^8.0.0' }, npm WARN EBADENGINE current: { node: 'v14.21.2', npm: '7.24.2' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@nextcloud/[email protected]', npm WARN EBADENGINE required: { node: '^16.0.0', npm: '^7.0.0 || ^8.0.0' }, npm WARN EBADENGINE current: { node: 'v14.21.2', npm: '7.24.2' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@nextcloud/[email protected]', npm WARN EBADENGINE required: { node: '^16.0.0', npm: '^7.0.0 || ^8.0.0' }, npm WARN EBADENGINE current: { node: 'v14.21.2', npm: '7.24.2' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@nextcloud/[email protected]', npm WARN EBADENGINE required: { node: '^16.0.0', npm: '^7.0.0 || ^8.0.0' }, npm WARN EBADENGINE current: { node: 'v14.21.2', npm: '7.24.2' } npm WARN EBADENGINE }

    I like to specify engine-strict=TRUE in a .npmrc file in the same directory as package.json to fail installations when unsupported engines are used rather than simply warn, but that may be too draconian for some.

    opened by universalhandle 1
Releases(v4.9.3)
Owner
Varun Patil
UCLA CS PhD Candidate
Varun Patil
Yet another Value Object Library (YAVOL)

Yet Another DDD Library Value object This library is a foundation in order to implement the Value Object pattern. It helps you to introduce some DDD s

YADDDL 3 Nov 17, 2022
Jump is yet another self-hosted startpage for your server designed to be simple, stylish, fast and secure.

Jump Jump is yet another self-hosted startpage for your server designed to be simple, stylish, fast and secure. Features Fast, easy to deploy, secure

Dale Davies 309 Dec 27, 2022
What do developers do on holidays? Right! Yet another sudoku.

yasu This is a project that happened to obsess the contributors on a greek island in the summer of 2022: figure out how to generate and solve sudoku b

null 2 Sep 18, 2022
πŸ”– Bookmark app for Nextcloud

Nextcloud Bookmarks Bookmarks app for Nextcloud This app provides you with a web interface for collecting and organizing bookmarks to the places on th

Nextcloud 803 Jan 8, 2023
Nextcloud app to do preview generation

Preview Generator Nextcloud app that allows admins to pre-generate previews. The app listens to edit events and stores this information. Once a cron j

Nextcloud 343 Dec 29, 2022
Nextcloud-App to add groups with AppDirect

App Direct Place this app in nextcloud/apps/ Building the app The app can be built by using the provided Makefile by running: make This requires the

Tim VosskΓΌhler 3 Dec 2, 2022
Orangescrum is a simple yet powerful free and open source project management software that helps team to organize their tasks, projects and deliver more.

Free, open source Project Management software Introduction Orangescrum is the simple yet powerful free and open source project management software tha

Orangescrum 110 Dec 30, 2022
Game Boy Camera Wifi Photo Extractor

Game Boy Camera Fast Wifi Adapter Plug in your Game Boy Camera, turn it on, and you can have the photos on your phone in under 2 minutes! Why I Made I

Matt G 71 Dec 16, 2022
Resources back-end for the Nextcloud CalDAV server

Calendar Resource Management This app enables the ??️ Calendar App to work with resources and rooms Installation Place this app in nextcloud/apps/ You

Nextcloud 35 Nov 8, 2022
A plugin to make Nextcloud compatible with Solid

solid-nextcloud A plugin to make Nextcloud compatible with Solid.

PDS Interop 54 Jan 2, 2023
β†ͺοΈπŸ”” Send notification action for Nextcloud Flow

Nextcloud Flow Notifications ?? Notification action for Nextcloud Flow ?? Configure your flow ?? Receive notifications ?? Development setup ☁ Clone th

Nextcloud 13 Dec 2, 2022
From the team that brought you laravel-random-command comes another gem!

?? Why require one if you can require them all? From the team that brought you laravel-random-command comes another gem! Requiring all our packages se

Spatie 46 Oct 5, 2022
A PocketMine-MP plugin that replaces a block to another block when breaks, then back to the original block after a certain time

BlockReplacer A PocketMine-MP plugin that replaces a block to another block when breaks, then back to the original block after a certain time How to I

AIPTU 11 Sep 2, 2022
Magento commands to find translations that are present in one CSV file but not in another, and to translate CSV dicts with DeepL

HyvΓ€ Themes - Magento translation CSV comparison command hyva-themes/magento2-i18n-csv-diff This module adds the bin/magento i18n:diff-csv and i18n:tr

HyvΓ€ 6 Oct 26, 2022
Another initiative where patient in need of Blood and recovered patients willing to donate Blood can come together under one platform and connect with each other.

This is yet another initiative where patient in need of Blood and recovered patients willing to donate Blood can come together under one platform and connect with each other.

Rohit Tiwari 1 May 5, 2022
A PHP wrapper around Libreoffice for converting documents from one format to another.

Document Converter A PHP wrapper around Libreoffice for converting documents from one format to another. For example: Microsoft Word to PDF OpenOffice

Lukas White 0 Jul 28, 2022
API plugin to open a dialog for choosing another player.

ChoosePlayer API plugin for choosing a player interactively. API Let player select another player This API method opens a dialog to let player $choose

Jonathan Chan Kwan Yin 4 Aug 16, 2022
A Tinder-like experience for Plex Watchlist: swipe and match with another person and find the movie you're gonna watch tonight.

Plex Finder This app's goal is to help choose a film to watch when neither you nor your SO/friend/roommate/whatever is any good at choosing anything.

Guillaume Hartemann-Piollet 3 Aug 13, 2022
Simple yet powerful, PSR-compliant, Symfony-driven PHP Blog engine.

brodaty-blog βœ’οΈ Simple Blog Engine based on pure Markdown files. ?? Works without database, caches HTML templates from Markdown files. ?? Fast and ext

Sebastian 3 Nov 15, 2022