Gramps Connect Demo 0.3.2

Update on a new project Gramps Connect, version 0.3.2: there are now stand-alone downloads for MacOS/arm64, MacOS/intel, Windows, and an rpm/deb for Linux.

(under assets). See the README.md for more instructions on installing:

What is this? I’ve made stand-alone versions of a webserver app. What the heck? Yes, so Gramps Connect is designed to be a multi-user, collaborative server app. But you can actually run it as just a desktop app. Why? well it is very easy for you to download (fairly small) and install (has a installer). Then you can give me feedback on the design so far.

It looks like this on most of the apps, as it opens as its own window:

The username is admin password is admin. You can import GEDCOM, Gramps XML, and any built-in importers.

Try it out and see if it works for you.

Cc: @csam for new macos/intel

Thank you @dsblank
Imported my latest backup without any errors.

There were a few warnings in the console output:

<frozen importlib._bootstrap>:488: Warning: OpenSSL 3's legacy provider failed to load. Legacy algorithms will not be available. If you need those algorithms, check your OpenSSL configuration.
Missing or invalid localedir '/Users/sam/Development/GrampsConnect/gramps-connect-demo/_internal/gramps-resources/locale'; no translations will be available.
.gramps.gen.utils.grampslocale.WARNING: ICU not loaded because No module named 'PyICU'. Localization will be impaired. Use your package manager to install PyICU
Missing or invalid localedir None; no translations will be available.
ERROR: Failed reading plugin registration geography.gpr.py
Traceback (most recent call last):
  File "gramps/gen/plug/_pluginreg.py", line 1427, in scan_dir
  File "geography.gpr.py", line 32, in <module>
ImportError: cannot import name 'Repository' from 'gi' (unknown location). Did you mean: 'repository'?

flask_limiter/_extension.py:364: UserWarning: Using the in-memory storage for tracking rate limits as no storage was explicitly specified. This is not recommended for production use. See: https://flask-limiter.readthedocs.io#configuring-a-storage-backend for documentation about configuring the storage backend.
First run -- setting up demo tree in /Users/sam/.gramps-connect-demo ...

Plugin error (from 'gtkprint'): No module named 'cairo'
Plugin error (from 'cairodoc'): cannot import name 'Pango' from 'gi.repository' (unknown location)

macOS/Intel build works end-to-end! That’s the first real confirmation. Walking through the warnings:

Benign, ignore:

  • OpenSSL legacy provider, PyICU missing, flask-limiter in-memory storage — standard Python/Flask noise, unrelated to this build.
  • Missing or invalid localedir … no translations (both occurrences) — expected. We deliberately ship English-only for now with no compiled translations

Expected side-effect of a fake gi:

  • Failed reading plugin registration geography.gpr.py: ImportError: cannot import name ‘Repository’ from ‘gi’ — this is the same known failure seen on Linux CI (gi is stubbed out entirely to avoid bundling PyGObject/GTK). geography was already known to fail; harmless, unused by the web app.
  • Plugin error (from ‘gtkprint’) / (from ‘cairodoc’) — new-to-me specific instances, but same root cause: no real cairo/Pango behind the stub. This means Gramps’ cairo-based docgen backend (used for some report output formats) isn’t available in this bundle.

That last one is the only item worth following up on: did the report-generation you tested actually produce output, or did you not get that far in the walkthrough? If cairodoc is the backend used for PDF/ODF report output, some report formats could silently fail server-side rather than just log a startup warning — worth confirming which format(s) you tried.

I tried the .deb file and got permission denied. It says “Download is performed unsandboxed as root” but I was not logged in as root (I never do that), just as my regular account which has sudo access.

georgewilmes@debian:~/Downloads$ sudo apt install ./gramps-connect-demo_0.3.2_amd64.deb
Note, selecting ‘gramps-connect-demo’ instead of ‘./gramps-connect-demo_0.3.2_amd64.deb’
Installing:
gramps-connect-demo

Summary:
Upgrading: 0, Installing: 1, Removing: 0, Not Upgrading: 0
Download size: 0 B / 83.4 MB
Space needed: 207 MB / 875 GB available

Get:1 /home/georgewilmes/Downloads/gramps-connect-demo_0.3.2_amd64.deb gramps-connect-demo amd64 0.3.2 [83.4 MB]
Selecting previously unselected package gramps-connect-demo.
(Reading database … 592218 files and directories currently installed.)
Preparing to unpack …/gramps-connect-demo_0.3.2_amd64.deb …
Unpacking gramps-connect-demo (0.3.2) …
Setting up gramps-connect-demo (0.3.2) …
Processing triggers for desktop-file-utils (0.28-1) …
Processing triggers for gnome-menus (3.36.0-3) …
Processing triggers for mailcap (3.74) …
Notice: Download is performed unsandboxed as root as file ‘/home/georgewilmes/Downloads/gramps-connect-demo_0.3.2_amd64.deb’ couldn’t be accessed by user ‘_apt’. - pkgAcquire::Run (13: Permission denied)

Running the text report “Descendant Report” I get “Report ready”, but I can’t find the output.

Running the graphical report “Descendant Tree” I get “Report failed” with error 500 and the following in the console output:

127.0.0.1 - - [16/Aug/2026 16:14:43] "POST /api/media/ HTTP/1.1" 500 -
Error on request:
Traceback (most recent call last):
  File "werkzeug/serving.py", line 371, in run_wsgi
  File "werkzeug/serving.py", line 332, in execute
  File "flask/app.py", line 1536, in __call__
  File "flask/app.py", line 1514, in wsgi_app
  File "flask_cors/extension.py", line 206, in wrapped_function
  File "flask/app.py", line 1511, in wsgi_app
  File "flask/app.py", line 919, in full_dispatch_request
  File "flask_cors/extension.py", line 206, in wrapped_function
  File "flask/app.py", line 917, in full_dispatch_request
  File "flask/app.py", line 902, in dispatch_request
  File "gramps_webapi/api/auth.py", line 44, in wrapper
  File "flask/views.py", line 110, in view
  File "gramps_webapi/api/resources/__init__.py", line 51, in dispatch_request
  File "gramps_webapi/api/resources/media.py", line 87, in post
  File "gramps_webapi/api/media.py", line 130, in upload_file
  File "gramps_webapi/api/media.py", line 72, in get_default_filename
ValueError: MIME type not recognized

That is expected and not really an error. It should have either opened a window, or opened a browser tab. Did either of those happen?

Ah, yes. There is a icon on the far left “Output”. You should be able to find it there.

I’ll take a look the other tracback. Thanks for trying/reporting!

… but you are running ‘sudo’, which will run the ‘apt install’ with root permmissions.

In any event, it isn’t an issue.

Sorry, but I don’t have that icon.

Gramps for Desktops has a similar behavior. If you do not select the Reports option to “Open with default viewer”, the report generates silently. And if you do not recall the Filename path, you have to re-run the report plugin to discover the Filename: path in the options dialog.

I’ve always felt that was an unhappy system. And I’ve accidentally spewed Reports and backup files far and wide.

(I would have been happier in Gramps for desktops if these 'successful` file writes were logged to the file that is accessible when the lightbulb appears in the statusbar.)

Sorta. In gramps-connect once you know to look in Output, then it acts as a log (good suggestion for the desktop) and record. I like the idea in gramps-connect because you have that output saved and compared later, and can be shared with collaborators. It is stored in media objects, which can make your media exports even bigger.

In gramps-web it is worse than both of these: if you move away from where you are running the report, it is lost.

I think that option is not in Gramps Connect yet. However, when the report is ready, the report name (I guess) is displayed - e.g. “Desendant Report (I0381) - 2026-08-16”.
I used ‘find’ to search for this filename, but can’t find it.

Far left, at bottom:

Screenshot from 2026-08-16 07-41-03

Let me know if you don’t see that icon.

It isn’t a file, but a row in the media object table.

I should make that message clickable.

Got it! and downloaded the report.

So the reports are stored in a container, and that’s why I couldn’t find :slight_smile:

I ran the text report with default options - output to an ODT file.

When I tried to change the output to a plain text file, I got error 500:

127.0.0.1 - - [16/Aug/2026 16:53:36] "POST /api/reports/descend_report/file?options={"off":"txt","pid":"I0381"} HTTP/1.1" 201 -
127.0.0.1 - - [16/Aug/2026 16:53:36] "GET /api/reports/descend_report/file/processed/3135023d-3da7-4f8e-92da-b1f666d6c4be.txt HTTP/1.1" 200 -
127.0.0.1 - - [16/Aug/2026 16:53:36] "POST /api/media/ HTTP/1.1" 500 -
Error on request:
Traceback (most recent call last):
  File "werkzeug/serving.py", line 371, in run_wsgi
  File "werkzeug/serving.py", line 332, in execute
  File "flask/app.py", line 1536, in __call__
  File "flask/app.py", line 1514, in wsgi_app
  File "flask_cors/extension.py", line 206, in wrapped_function
  File "flask/app.py", line 1511, in wsgi_app
  File "flask/app.py", line 919, in full_dispatch_request
  File "flask_cors/extension.py", line 206, in wrapped_function
  File "flask/app.py", line 917, in full_dispatch_request
  File "flask/app.py", line 902, in dispatch_request
  File "gramps_webapi/api/auth.py", line 44, in wrapper
  File "flask/views.py", line 110, in view
  File "gramps_webapi/api/resources/__init__.py", line 51, in dispatch_request
  File "gramps_webapi/api/resources/media.py", line 87, in post
  File "gramps_webapi/api/media.py", line 130, in upload_file
  File "gramps_webapi/api/media.py", line 72, in get_default_filename
ValueError: MIME type not recognized

Yes, I saw that and will have a new version soon. Thanks!

Yes, once I launched it, it opened in a new browser tab. I was just looking for confirmation that the error was not an issue before proceeding. Thanks!