{"id":50320660,"url":"https://github.com/memorymapper/memorymap-toolkit","last_synced_at":"2026-06-14T18:00:38.544Z","repository":{"id":43228533,"uuid":"271835321","full_name":"memorymapper/memorymap-toolkit","owner":"memorymapper","description":"An open source web application for creating interactive maps for history and heritage. Created by the Bartlett Centre for Advanced Spatial Analysis, University College London. Built with Django, PostGIS, and MapboxGL.","archived":false,"fork":false,"pushed_at":"2026-05-12T16:38:26.000Z","size":2464,"stargazers_count":27,"open_issues_count":4,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-05-12T18:32:40.785Z","etag":null,"topics":["architecture","django","django-project","heritage","history","mapbox-gl-js","maps","postgis"],"latest_commit_sha":null,"homepage":"https://memorymapper.github.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/memorymapper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-06-12T15:48:26.000Z","updated_at":"2026-05-12T16:59:44.000Z","dependencies_parsed_at":"2023-10-10T15:21:41.432Z","dependency_job_id":"add8fdb7-fa2f-4fb5-b1d1-d5084a8990b3","html_url":"https://github.com/memorymapper/memorymap-toolkit","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/memorymapper/memorymap-toolkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memorymapper%2Fmemorymap-toolkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memorymapper%2Fmemorymap-toolkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memorymapper%2Fmemorymap-toolkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memorymapper%2Fmemorymap-toolkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/memorymapper","download_url":"https://codeload.github.com/memorymapper/memorymap-toolkit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memorymapper%2Fmemorymap-toolkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34331812,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["architecture","django","django-project","heritage","history","mapbox-gl-js","maps","postgis"],"created_at":"2026-05-29T03:04:51.015Z","updated_at":"2026-06-14T18:00:38.539Z","avatar_url":"https://github.com/memorymapper.png","language":"Python","funding_links":[],"categories":["Interactive Content"],"sub_categories":[],"readme":"# Memory Map Toolkit\n\nThe Memory Map Toolkit is a web application for creating interactive maps for heritage, history, tourism, or any other circumstance in which you want to attach audio, images, text or video to an interactive web map.\n\nIt is built and maintained by Duncan Hay at the Bartlett Centre for Advanced Spatial Analysis and the School of Architecture, University College London.\n\n\n## Features\n\n- Fully-featured content management system built using Django\n- Advanced web mapping built with MapboxGL\n- Customisable map styles\n- Support for multiple basemaps, including Mapbox, Maptiler Cloud, and self-hosted raster and vector tiles\n- Responsive design for mobile, tablet, and desktop use\n\n\n## Installation\n\nWe are unable to offer comprehensive installation for all platforms. However, below is a quickstart guide for Ubuntu 20.04 Server Edition using Apache.\n\n### Prerequisites\n\n- A server capable of running Python 3, Django, PostgreSQL / Postgis, and Apache or Nginx to which you have adminstrative access. We've had good experiences using DigitalOcean https://www.digitalocean.com/.\n\n- A domain name that you want to use for your map and some experience of using DNS records.\n\n- Some experience of using the linux command line, logging in to a server using SSH, and familiarity with installing packages and editing configuration files.\n\n- To use the default map style, you need to sign up for a free account with MapTiler Cloud https://www.maptiler.com/cloud/.\n\n### 0. Inititial Server Setup\n\nFollow the instructions for initial server setup here: https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04\n\nOnce done, you should have SSH access to your server and have enabled Ubuntu's built-in firewall.\n\n### 1. Install the Required Packages\n\n```bash\nsudo apt update\nsudo apt install python3-pip python3-venv postgresql postgresql-contrib postgis python3-dev libpq-dev memcached apache2 libapache2-mod-wsgi-py3\n```\n\n### 2. Create a New Python Environment\n\n```bash\nmkdir venv\npython3 -m venv venv/memorymap-toolkit\nsource venv/memorymap-toolkit/bin/activate\n```\n\n### 3. Download the Memory Map Toolkit and Install the Required Python Libraries\n```bash\ngit clone https://github.com/memorymapper/memorymap-toolkit.git\ncd memorymap-toolkit\npip install -r requirements.txt\n```\n\n### 4. Configure the Database\n```bash\nsudo -u postgres psql\n```\n```sql\nCREATE USER memorymappper WITH PASSWORD 'your_password';\nCREATE DATABASE memorymap;\nGRANT ALL PRIVILEGES ON DATABASE memorymap TO memorymapper;\n\\c memorymap;\nCREATE EXTENSION postgis;\n\\q\n```\nReplace the ```memorymapper```, ```'your_password'```, and ```memorymap``` with your own secure database settings and keep a record of them!\n\n### 5. Add the Database Settings to the Memory Map Toolkit\n\nOnce you've configured the database, you then need to edit the Memory Map Toolkit configuration files.\n\nThe commands below create a new 'secret_settings.py' file (based on a template) and opens the Nano text editor.\n\n```bash\ncp memorymap_toolkit/settings/secret_settings_template.py memorymap_toolkit/settings/secret_settings.py\nnano memorymap_toolkit/settings/secret_settings.py\n```\n\nYou will see the following:\n\n```python\n# SECURITY WARNING: keep the secret key used in production secret!\nSECRET_KEY = ''\n\nALLOWED_HOSTS = []\n\n# Database\n# https://docs.djangoproject.com/en/3.0/ref/settings/#databases\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.contrib.gis.db.backends.postgis',\n        'HOST': 'localhost',\n        'NAME': '',\n        'USER': '',\n        'PASSWORD': ''\n    }\n}\n\n# If you want to use Google Analytics to monitor traffic to your site, put your tracking code here\n\nGOOGLE_ANALYTICS_PROPERTY_ID = ''\n\n# Uncomment the lines below if you've enabled SSL for your site. Not strictly secret settings, but kept here so they are kept out of version control.\n\n# SECURE_SSL_HOST = True\n\n# SESSION_COOKIE_SECURE = True\n\n# CSRF_COOKIE_SECURE = True\n```\n\nGo to https://miniwebtool.com/django-secret-key-generator/ and generate a new secret key. Copy and paste this into the ```SECRET_KEY``` setting.\n\nIn ```ALLOWED_HOSTS``` add the domain name from which visitors will be able to view your map. For example, if people will go to www.mymemorymap.com, your allowed hosts setting will look like this:\n\n```python\nALLOWED_HOSTS = ['www.mymemorymap.com']\n```\n\nIn the ```DATABASES``` section, edit the ```NAME```, ```USER``` and ```PASSWORD```\nsettings to reflect how you configured the database, ie:\n\n```python\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.contrib.gis.db.backends.postgis',\n        'HOST': 'localhost',\n        'NAME': 'memorymap',\n        'USER': 'memorymapper',\n        'PASSWORD': 'your_password'\n    }\n}\n```\n\nType ctrl+x to exit Nano, remembering to choose 'Yes' to save your changes.\n\nWhen you've quit nano, run the following commands to migrate the database and copy the static files into the correct directory for deployment.\n\n```bash\npython manage.py migrate --settings=memorymap_toolkit.settings.local\npython manage.py collectstatic --settings=memorymap_toolkit.settings.local\n```\nIf you encounter a permissions error, you may need to re-grant the postgres privileges to the dbuser\n\n```\npsql memorymap -c \"GRANT ALL ON ALL TABLES IN SCHEMA public to memorymapper;\"\npsql memorymap -c \"GRANT ALL ON ALL SEQUENCES IN SCHEMA public to memorymapper;\"\npsql memorymap -c \"GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to memorymapper;\"\n```\n\n\nYou then need to create a 'media' folder to store file uploads to your memory map. This needs to be owned by the user/group of your web server:\n\n```bash\nmkdir media\nsudo chown -R www-data:www-data media/\n```\n\nThe do the same for the 'logs' directory, where error logs which can help diagnose problems with your site are stored:\n\n```bash\nmkdir logs\nsudo chown -R www-data:www-data logs/\n```\n\nFinally, you need to create a user on the Toolkit so you can log in to the admin site:\n\n```bash\npython manage.py createsuperuser --settings=memorymap_toolkit.settings.local\n```\n\n### 6. Test Everything Works\n\nFirst, we'll need to open a port on the firewall:\n\n```bash\nsudo ufw allow 8000\n```\nThen we use Django's built-in test web server to test the site:\n\n```bash\npython manage.py runserver 0:8000 --settings=memorymap_toolkit.settings.local\n```\n\nIn your web browser, enter the IP address of your server, followed by /admin/. For example, ```192.168.0.4:8000/admin/```.\n\nIf everything worked, you will see the login page.\n\nGo back to your terminal window and close port 8000 again:\n\n```bash\nsudo ufw deny 8000\n```\n\n### 7. Configure Apache\n\nWe have provided an example Apache configuration file to get you started. This is not the only way you can configure your web server, and if you have particular requirements it may not be suitable for your needs. See https://docs.djangoproject.com/en/3.0/howto/deployment/ for more details.\n\nFirst, edit the example configuration (note that some of the lines are quite long -  you might need to make your terminal window bigger to see them):\n\n```bash\nnano example-apache-configuration.conf\n```\n\nChange the ```ServerName``` line to reflect the address from which users will access your Memory Map, eg: ```ServerName www.mymemorymap.com```. In the rest of the file, replace ```\u003cyour_user_name\u003e``` with the name of the user account which you use to administer your server. For example, if you're logged in as memorymapper, the ```WSGIScriptAlias``` line will look like this: \n\n```\nWSGIScriptAlias / /home/memorymapper/memorymap-toolkit\n```\n\nOnce you've finished editing the configuration, quit Nano and save the file, and then copy it to your Apache configuration, naming it after the name of your website, eg:\n\n```bash\nsudo cp example-apache-configuration.conf /etc/apache2/sites-available/www.mymemorymap.com.conf\n```\n\nThen enable the configuration and restart Apache:\n```bash\nsudo a2dissite 000-default.conf\nsudo a2ensite www.memorymap.com.conf\nsudo service apache2 reload\n```\n\nFinally, you need to open ports 80 and 443 on the firewall:\n\n```bash\nsudo ufw allow 'Apache Full'\n```\n\n### 8. Connect Your Domain Name\n\nIt's beyond the scope of this document to give full instructions for configuring your domain name as the exact process varies according to your DNS provider. However, you need to add a new A record pointing to the IP address of your server so that it can be accessed over the web. Instructions for GoDaddy can be found here: https://uk.godaddy.com/help/manage-dns-zone-files-680\n\nOnce you've connected your domain name, you should now be able to visit your website at the correct address. However, when you first visit the map won't appear as some final configuration steps need to be completed.\n\n\n### 9. Configure The Map\n\nVisit ```www.mymemorymap.com/memorymapper-admin/``` and log in using the credentials you created using the ```createsuperuser``` command you ran earlier.\n\nOnce you've logged in, click on the 'config' link (under 'Constance'). Most of these settings (at least initially) can be left at their defaults. However, there are couple of settings that need to be filled in before you can start using your map.\n\nThe Memory Map Toolbox ships with a basic map style which uses Ordnance Survey Open ZoomStack tiles hosted with MapTiler Cloud. This is a detailed base map covering the whole of the United Kingdom. In order to use it, you need to sign up for a free account with MapTiler Cloud (https://www.maptiler.com/cloud/) and copy your access key into the MAPTILER_KEY box.\n\nThe default map is a good base map choice if you're in the UK. However, if your memory map is located elsewhere, you'll need to use something else. The easiest option is to use a pre-created style from MapBox or MapTiler and copy the StyleJSON link (https://docs.mapbox.com/api/maps/#retrieve-a-style), including your access key, into the BASE_MAP_STYLE_URL box. If you're using a MapBox style, you also need to copy your key into the MAPBOX_KEY box. It is also possible to use your own self-hosted map tiles and style, though this is beyond the scope of this document.\n\nYou also need to edit the MAP_CENTRE_LATITUDE and MAP_CENTER_LONGITUDE settings to change where your map is centred when it first loads.\n\nClick the 'Save' button at the bottom of the page, and then click on the 'Visit Site' link in the top right hand corner.\n\nAll being well, you'll see a blank Memory Map, ready for you to get started.\n\n#### Next Steps\n\n- Add an 'About' page to let people know what your Memory Map shows\n- Change the ```WELCOME_MESSAGE``` setting in the map config\n- Design a custom map style in [Maputnik](https://maputnik.github.io/)\n- Add a some points, polygons, or lines to your Memory Map\n\n### 10. Extra - SSL\n\nWe **highly recommend** that you install an SSL certificate so that traffic to and from your website is encrypted. This will also allow users to share their location with your memory map and see where they are on the map.\n\nThe easiest (and cheapest) way to do this is to use LetsEncrypt and CertBot: follow the instructions at https://certbot.eff.org/lets-encrypt/ubuntufocal-apache to get started.\n\n\n## Testing\n\nThe codebase has full test coverage at Model level. To run the tests:\n\n```bash\npython manage.py test mmt_map.tests; python manage.py test mmt_pages.tests\n```\n\nAt present there is no test coverage for views, forms, or the front-end.\n\n## Docker\n\nDocker uses a different settings file (docker-settings.py) which looks for environmental variables to connect to the database; pass the environmental variables to the container when starting it. \nCreate the Database as normal. \nThe 'media' directory is mounted as a volume. \n\nBuild the Dockerfile\n``` docker build . -t memorymapper```\n\nRun\n```docker run -e SECRET_KEY=\u003csecret_key\u003e -e DB_HOSST=\u003cdb_host\u003e -e DB_USERNAME=\u003cdb_username\u003e -e DB_PASSWORD=\u003cdb_password\u003e -e DB_NAME=memorymap -e ALLOWED_HOSTS=172.17.0.2 -e GOOGLE_ANALYTICS_PROPERTY_ID=\u003cid\u003e --mount source=media,target=/home/django-data/media  memorymapper ```\n\nThe container should run alongside an apache/nginx container to reverse proxy and serve the static files. \n\n## Copyright\n\nCopyright (C) 2020 University College London\n\nd.hay@ucl.ac.uk\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see \u003chttps://www.gnu.org/licenses/\u003e.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmemorymapper%2Fmemorymap-toolkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmemorymapper%2Fmemorymap-toolkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmemorymapper%2Fmemorymap-toolkit/lists"}