{"id":40909583,"url":"https://github.com/deeunderscore/ap-perkeep-uploader","last_synced_at":"2026-01-22T03:02:01.391Z","repository":{"id":70332241,"uuid":"133258282","full_name":"DeeUnderscore/ap-perkeep-uploader","owner":"DeeUnderscore","description":"A program for importing Mastodon user data takeouts into Perkeep","archived":false,"fork":false,"pushed_at":"2018-05-13T17:35:55.000Z","size":8,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-20T10:55:53.466Z","etag":null,"topics":["activitystreams","mastodon","perkeep"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DeeUnderscore.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}},"created_at":"2018-05-13T17:13:29.000Z","updated_at":"2024-05-31T02:24:56.000Z","dependencies_parsed_at":"2023-05-14T05:45:47.031Z","dependency_job_id":null,"html_url":"https://github.com/DeeUnderscore/ap-perkeep-uploader","commit_stats":{"total_commits":1,"total_committers":1,"mean_commits":1.0,"dds":0.0,"last_synced_commit":"7c790fa9980f1718f92d958d777b4a200cb8dbba"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DeeUnderscore/ap-perkeep-uploader","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeeUnderscore%2Fap-perkeep-uploader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeeUnderscore%2Fap-perkeep-uploader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeeUnderscore%2Fap-perkeep-uploader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeeUnderscore%2Fap-perkeep-uploader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DeeUnderscore","download_url":"https://codeload.github.com/DeeUnderscore/ap-perkeep-uploader/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DeeUnderscore%2Fap-perkeep-uploader/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28651817,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"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":["activitystreams","mastodon","perkeep"],"created_at":"2026-01-22T03:01:57.909Z","updated_at":"2026-01-22T03:02:01.378Z","avatar_url":"https://github.com/DeeUnderscore.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ActivityPub Perkeep Uploader\nThis tool takes JSON-LD files with [ActivityStreams](https://www.w3.org/TR/activitystreams-core/) data, such as those found in [Mastodon](https://joinmastodon.org/) data takeouts, and puts them in a [Perkeep](https://perkeep.org/) (formerly known as Camlistore) server. \n\nThe goal is to represent ActivityStream objects, such as a `Note` inside the Perkeep store, much the same way that Twitter tweets can be imported using the importer included with Perkeep.\n\n## Notes and warnings\nThis tool targets Mastodon data takeouts. ActivityStreams and ActivityPub are standards, which means that the tool *may* also be able to process data acquired elsewhere, but some missing features may make that impossible—for example, files are not fetched from remote URLs. This tool is not a full ActivityPub client, nor is it a Perkeep importer (in that it is not part of the Perkeep daemon).\n\nDeleting things out of Perkeep is currently rather difficult. This includes any data this tool puts in Perkeep. Please keep this in mind when using it. \n\nAs the program issues requests synchronously, and has to sign a large amount of blobs, it can take a while to process a large amount of notes. It will skip already existing permanodes, and so can be reran after interruptions. \n\n## How to \n### Installation\n\nDependencies can be downloaded with [Pipenv](https://docs.pipenv.org/).\n```shellsession\n$ pipenv install \n```\n\nIf you do not use Pipenv, you can use the supplied `requirements.txt` with Pip as usual (perhaps activating your own virtualenv beforehand):\n```shellsession\n$ pip install -r requirements.txt \n```\n\n### Usage\nIf your data takeout is in an archive (like Mastodon's is), you will need to extract it somewhere. Then, invoke `upload_dump.py` and point it at the directory and the Perkeep server. You can do it via Pipenv:\n```shellsession\n$ pipenv run upload_dump --directory path/to/extracted/archive http://localhost:3179\n```\n\nWithout Pipenv, use `python3 upload_dump.py` instead.\n\nIf you do not supply an `--actor`, the program will try to find one. The Mastodon takeout contains only one actor node, so it should be found easily. You can also supply `-v` for more verbose logging to stdout. \n\n## Schema\n\nEach `Create` activity with a `Note` object gets a permanode with the following attributes:\n\n* **asId**: the `id` field of the activity\n* **asObjectId**: the `id` of the object the activity created\n* **asActor**: the `id` of the Actor responsible for this activity\n* **camliPath:object**:  blobref of the ActivityStreams JSON, with both the activity and the object. This is the JSON directly, not a Perkeep schema node.\n* **camliPath:attachmentN**: where *N* is replaced by a 0-indexed, non-padded number. These are the attachments to the `Note` object, in the same order as in the attachments array in the ActivityStreams JSON.\n* **content**: the content of the note. Summary and content fields are concatenated here.\n* **startDate**: set to the time stamp for the activity\n* **camliType**: set to `ActivityStreams:Create:Note`\n\n\n## License\nThe source files in this project is available under the ISC license. For full text, see [LICENSE](/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeeunderscore%2Fap-perkeep-uploader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeeunderscore%2Fap-perkeep-uploader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeeunderscore%2Fap-perkeep-uploader/lists"}