gedcom-privacy-guard 0.4.0b1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gedcom_privacy_guard-0.4.0b1/.gitignore +17 -0
- gedcom_privacy_guard-0.4.0b1/CHANGELOG.md +250 -0
- gedcom_privacy_guard-0.4.0b1/LICENSE +21 -0
- gedcom_privacy_guard-0.4.0b1/PKG-INFO +129 -0
- gedcom_privacy_guard-0.4.0b1/README.md +109 -0
- gedcom_privacy_guard-0.4.0b1/docs/adr/README.md +30 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/__init__.py +1 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/__main__.py +6 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/cli.py +203 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/builtin-rules.js +191 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/editor.js +550 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/rules-editor.html +297 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/rules-engine.js +749 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/vendor/js-yaml-LICENSE.txt +21 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/vendor/js-yaml.min.js +2 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/encoding.py +211 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/parser.py +405 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/redactor.py +209 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/report.py +470 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/rules.py +331 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/rules.yaml +196 -0
- gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/scanner.py +206 -0
- gedcom_privacy_guard-0.4.0b1/pyproject.toml +65 -0
- gedcom_privacy_guard-0.4.0b1/sample_data/sample.ged +53 -0
- gedcom_privacy_guard-0.4.0b1/tests/conftest.py +27 -0
- gedcom_privacy_guard-0.4.0b1/tests/js/editor_harness.js +54 -0
- gedcom_privacy_guard-0.4.0b1/tests/test_editor.py +353 -0
- gedcom_privacy_guard-0.4.0b1/tests/test_encoding.py +97 -0
- gedcom_privacy_guard-0.4.0b1/tests/test_fuzz.py +102 -0
- gedcom_privacy_guard-0.4.0b1/tests/test_hardening.py +158 -0
- gedcom_privacy_guard-0.4.0b1/tests/test_no_network.py +142 -0
- gedcom_privacy_guard-0.4.0b1/tests/test_pipeline.py +413 -0
- gedcom_privacy_guard-0.4.0b1/tests/test_rules.py +158 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Real family data lives here; never committed.
|
|
2
|
+
private/
|
|
3
|
+
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.pyc
|
|
6
|
+
.venv/
|
|
7
|
+
venv/
|
|
8
|
+
review.csv
|
|
9
|
+
review*.xlsx
|
|
10
|
+
cleaned.ged
|
|
11
|
+
*.ged
|
|
12
|
+
!sample_data/sample.ged
|
|
13
|
+
.DS_Store
|
|
14
|
+
.pytest_cache/
|
|
15
|
+
.ruff_cache/
|
|
16
|
+
.coverage
|
|
17
|
+
dist/
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. Format
|
|
4
|
+
follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/);
|
|
5
|
+
versioning follows [Semantic Versioning](https://semver.org/) --
|
|
6
|
+
pre-1.0, so MINOR bumps are breaking/notable changes and PATCH bumps
|
|
7
|
+
are fixes. `gedcom_privacy_guard/__init__.py`'s `__version__` is the
|
|
8
|
+
source of truth; each release here has a matching `git tag vX.Y.Z`.
|
|
9
|
+
|
|
10
|
+
See `ROADMAP.md` for the roadmap and `docs/adr/` for design
|
|
11
|
+
decisions -- this file tracks what actually shipped, not what's
|
|
12
|
+
planned.
|
|
13
|
+
|
|
14
|
+
## [Unreleased]
|
|
15
|
+
|
|
16
|
+
## [0.4.0b1] - 2026-10-29
|
|
17
|
+
|
|
18
|
+
First public release, as a beta for testers. Earlier versions were
|
|
19
|
+
private; the public repository starts from a single squashed commit,
|
|
20
|
+
so the tags for 0.1.0 to 0.3.1 exist only in this file.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- `pyproject.toml` with a `gedcom-privacy-guard` command, `uv.lock`, and a
|
|
25
|
+
dev toolchain: ruff, pytest, pip-audit, pre-commit (including gitleaks
|
|
26
|
+
and a hook blocking real GEDCOM files), GitHub Actions CI on
|
|
27
|
+
Windows/macOS/Linux, and Dependabot.
|
|
28
|
+
- `ROADMAP.md`: one prioritized roadmap with a competitive analysis.
|
|
29
|
+
- Scans every place text hides, not only person notes: notes on events,
|
|
30
|
+
families and sources, shared `NOTE` records, cause of death (`CAUS`),
|
|
31
|
+
source text (`TEXT`), citation detail (`PAGE`), media paths (`FILE`),
|
|
32
|
+
the submitter record (`SUBM`), addresses and custom `_TAG`s. A new
|
|
33
|
+
`found_in` column says where each finding is.
|
|
34
|
+
- Reads UTF-8 (with or without BOM), UTF-16, ANSEL and Windows ANSI,
|
|
35
|
+
with CRLF, LF or CR line endings.
|
|
36
|
+
- Rule presets `open`, `standard` (default) and `cautious` (`--preset`).
|
|
37
|
+
- Rules editor (`gedcom-privacy-guard editor`): one offline page to pick a
|
|
38
|
+
preset, turn categories on or off, set severity, add or remove words and
|
|
39
|
+
exceptions, add categories of your own, and test a pasted note. It opens
|
|
40
|
+
and saves your rules file, which holds only your changes. Its JavaScript
|
|
41
|
+
is checked against the Python scanner in the test suite (needs Node).
|
|
42
|
+
Bundles js-yaml 4.1.0 (MIT).
|
|
43
|
+
A user's rules file now holds only changes (`extends`, `add_terms`,
|
|
44
|
+
`remove_terms`, `exceptions`, new categories), so built-in
|
|
45
|
+
improvements still apply. Old-format rules files still load.
|
|
46
|
+
- Terms match whole words by default; `term*` matches a prefix and
|
|
47
|
+
`*term*` matches anywhere. Exceptions suppress known harmless phrases
|
|
48
|
+
("Great Depression", "prisoner of war").
|
|
49
|
+
- New categories: identity-number and contact patterns (SSN, phone,
|
|
50
|
+
email), submitter record, local file paths, text already marked
|
|
51
|
+
private (`[[ ]]`, `{ }`), and cautious-only family secrets, medical,
|
|
52
|
+
security questions and street addresses.
|
|
53
|
+
- `SECURITY.md`: how to report a vulnerability privately, and what counts
|
|
54
|
+
as one.
|
|
55
|
+
- `docs/legacy.md`: exporting from Legacy, the `[[ ]]` privacy marker,
|
|
56
|
+
bringing cleaned notes back in with Find Duplicates and Manual Merge,
|
|
57
|
+
and Legacy quirks that show up in the report.
|
|
58
|
+
- A "Summary" sheet in the report: what was scanned and what wasn't,
|
|
59
|
+
the preset and rules used, counts per category, and file warnings.
|
|
60
|
+
- `rules` command (check a rules file and list what's on) and
|
|
61
|
+
`--version`.
|
|
62
|
+
- Docs: a one-screen README with a screenshot; `docs/how-it-works.md`
|
|
63
|
+
(what it looks for, an example it catches and one it misses);
|
|
64
|
+
`docs/exporting.md` (per program, including Ancestry and what a
|
|
65
|
+
private tree doesn't cover); `docs/RULES.md` (writing your own rules
|
|
66
|
+
file); ADR-009 (rules file format); `CONTRIBUTING.md`; and issue
|
|
67
|
+
templates for a missed phrase and a false alarm.
|
|
68
|
+
- `docs/safety.md`, "Why your data is safe": what the tool does with
|
|
69
|
+
your file, how that's checked, how to check it yourself, and the ways
|
|
70
|
+
data can still leave (synced folders, sharing `review.xlsx`).
|
|
71
|
+
`tests/test_no_network.py` backs it: no network or process imports in
|
|
72
|
+
the package, a full scan → redact run under an audit hook that fails
|
|
73
|
+
on any connection, DNS lookup or new process, and checks of the rules
|
|
74
|
+
editor's Content-Security-Policy.
|
|
75
|
+
- `docs/help-wanted.md` for testers: a made-up family to enter and
|
|
76
|
+
export from other programs, the 15-minute test, and how to report;
|
|
77
|
+
issue templates *Sample export* and *Tried it*.
|
|
78
|
+
- Release workflow: pushing a `vX.Y.Z` tag checks it matches
|
|
79
|
+
`__version__`, runs the tests, builds and smoke-tests the wheel, then
|
|
80
|
+
publishes to PyPI by trusted publishing (no stored token; PyPI
|
|
81
|
+
attestations link each file to its commit).
|
|
82
|
+
|
|
83
|
+
### Changed
|
|
84
|
+
|
|
85
|
+
- **Report columns:** `note_line_start`/`note_line_end` (0-based) are
|
|
86
|
+
now `line`/`line_end` (1-based); `found_in` added after `name`.
|
|
87
|
+
Reports from earlier versions are still read.
|
|
88
|
+
- `maiden name` moved to the cautious-only `security_questions`
|
|
89
|
+
category; it flagged most genealogy notes.
|
|
90
|
+
- `redact`'s default `--out` is `cleaned.ged`.
|
|
91
|
+
- Scanning is about 15 times faster on large files.
|
|
92
|
+
- `requirements.txt` removed; install with `pipx install` or from
|
|
93
|
+
`pyproject.toml`. `docs/ARCHITECTURE.md` describes the current
|
|
94
|
+
parser, scanner and report, with new timings.
|
|
95
|
+
- `docs/reference/` (verbatim copies of Legacy's help) is replaced by
|
|
96
|
+
`docs/legacy.md`, in our own words with links to Legacy's help.
|
|
97
|
+
|
|
98
|
+
### Fixed
|
|
99
|
+
|
|
100
|
+
- Exceptions take the same `*` syntax as terms. The built-in ones now
|
|
101
|
+
cover plurals: "WWII prison camps", "POW camps", "prisoners of war"
|
|
102
|
+
and "economic depressions" are no longer flagged.
|
|
103
|
+
- README links are absolute GitHub URLs, so they work on PyPI.
|
|
104
|
+
- `redact` checks that every report row points at the same text in
|
|
105
|
+
this GEDCOM, and stops with no output if not, instead of overwriting
|
|
106
|
+
the wrong lines.
|
|
107
|
+
- Redacted, rewritten and privatized text keeps its own level, xref and
|
|
108
|
+
tag (it was always written as `1 NOTE`), is re-wrapped into
|
|
109
|
+
`CONT`/`CONC` lines under 255 characters, and the output keeps the
|
|
110
|
+
input's line endings and BOM. Non-UTF-8 input is written as UTF-8 with
|
|
111
|
+
the header's `CHAR` updated.
|
|
112
|
+
- Spaces at the ends of `CONC` lines were dropped, joining words.
|
|
113
|
+
- Report cells are never written as formulas, and FamilySearch and Find
|
|
114
|
+
a Grave URLs are built only from well-formed IDs.
|
|
115
|
+
- `scan` won't overwrite the GEDCOM or an existing report (use
|
|
116
|
+
`--force`), and `redact` won't overwrite the GEDCOM or the report.
|
|
117
|
+
- Every expected error is one plain line and exit status 1, never a
|
|
118
|
+
traceback; a Windows console no longer crashes on unusual characters.
|
|
119
|
+
|
|
120
|
+
### Not yet built
|
|
121
|
+
|
|
122
|
+
See `ROADMAP.md`, and open Action Items across
|
|
123
|
+
`docs/adr/*.md`, for what's planned but not implemented:
|
|
124
|
+
Vite+TS+Cloudflare deployment, LLM-based scanner, living-person
|
|
125
|
+
inference, diff mode, web-app support for `privatize`.
|
|
126
|
+
|
|
127
|
+
### Open questions (not yet verified)
|
|
128
|
+
|
|
129
|
+
- Whether Legacy's own "Ancestry Online Family Tree" GEDCOM export
|
|
130
|
+
type's built-in Privacy button already handles some of what this
|
|
131
|
+
tool checks for (see ADR-002, action item 3). Recommended export
|
|
132
|
+
path in the meantime: manual GEDCOM export with that type selected,
|
|
133
|
+
not the one-click direct-upload toolbar button, so there's always a
|
|
134
|
+
file to scan before anything reaches Ancestry.
|
|
135
|
+
- Whether the Find Duplicates + Manual Merge reimport workflow for
|
|
136
|
+
bringing privatized notes back into Legacy actually works as
|
|
137
|
+
described (see `docs/legacy.md`) --
|
|
138
|
+
not yet verified end-to-end on a real file.
|
|
139
|
+
|
|
140
|
+
## [0.3.1] - 2026-07-19
|
|
141
|
+
|
|
142
|
+
### Changed
|
|
143
|
+
|
|
144
|
+
- Report: `action` moved to column A (from last) and frozen alongside
|
|
145
|
+
the header row, so it stays visible while scrolling right through
|
|
146
|
+
context columns. `xref` moved to the tail next to `note_line_start`/
|
|
147
|
+
`note_line_end` -- it's a GEDCOM pointer needed for bookkeeping, not
|
|
148
|
+
something a human reviewer reads.
|
|
149
|
+
- Report: `action` now has an in-cell dropdown (keep / redact /
|
|
150
|
+
privatize / rewrite:) instead of requiring free typing; picking
|
|
151
|
+
`rewrite:` and typing your own text after it still works.
|
|
152
|
+
|
|
153
|
+
## [0.3.0] - 2026-07-19
|
|
154
|
+
|
|
155
|
+
### Added
|
|
156
|
+
|
|
157
|
+
- `privatize` action for `redact`: wraps just the flagged phrase in
|
|
158
|
+
`[[double brackets]]` -- Legacy's own native "exclude from exports/
|
|
159
|
+
reports" marker (see ADR-002) -- leaving the rest of the note
|
|
160
|
+
untouched, instead of replacing the whole note like `redact`/
|
|
161
|
+
`rewrite`. Multiple phrases flagged `privatize` on the same note
|
|
162
|
+
each get wrapped independently; `redact`/`rewrite` still take
|
|
163
|
+
priority over `privatize` over `keep` if a note has mixed actions.
|
|
164
|
+
- CLI now prints an explicit warning whenever any note was privatized:
|
|
165
|
+
`[[ ]]` is inert outside Legacy, so a privatize-only output is not
|
|
166
|
+
safe to upload directly to Ancestry/FamilySearch/etc. -- it needs to
|
|
167
|
+
go back into Legacy first. README documents the two different
|
|
168
|
+
post-`redact` paths accordingly.
|
|
169
|
+
|
|
170
|
+
### Fixed
|
|
171
|
+
|
|
172
|
+
- Privatize wraps the whole word around a matched keyword stem (e.g.
|
|
173
|
+
`alcoholi` -> `[[alcoholism]]`), not just the literal stem, avoiding
|
|
174
|
+
a stray suffix left outside the brackets.
|
|
175
|
+
|
|
176
|
+
## [0.2.1] - 2026-07-19
|
|
177
|
+
|
|
178
|
+
### Changed
|
|
179
|
+
|
|
180
|
+
- Report: `snippet` cells now wrap instead of running off-screen as one
|
|
181
|
+
long line, with a taller row height to fit a wrapped ~200-character
|
|
182
|
+
snippet.
|
|
183
|
+
- Report: `severity` now shows as a compact red/yellow/green circle
|
|
184
|
+
icon instead of the plain word, with the actual word ("High" /
|
|
185
|
+
"Medium" / "Low") available as a hover tooltip.
|
|
186
|
+
|
|
187
|
+
## [0.2.0] - 2026-07-19
|
|
188
|
+
|
|
189
|
+
### Changed
|
|
190
|
+
|
|
191
|
+
- **Review report is now `.xlsx`, not `.csv`** (ADR-006). The matched
|
|
192
|
+
term inside the `snippet` column is highlighted as bold/colored rich
|
|
193
|
+
text so it's visually distinct from its surrounding context at a
|
|
194
|
+
glance. `scan`'s default `--out` is now `review.xlsx`; `redact`'s
|
|
195
|
+
`--report` now expects `.xlsx`. New dependency: `openpyxl`.
|
|
196
|
+
|
|
197
|
+
## [0.1.2] - 2026-07-19
|
|
198
|
+
|
|
199
|
+
### Changed
|
|
200
|
+
|
|
201
|
+
- Scanner: snippet context window widened from 40 to 100 characters on
|
|
202
|
+
each side of a match, so a reviewer can usually judge a flag from
|
|
203
|
+
the CSV alone (e.g. tell "the Great Depression" or "WWII prison
|
|
204
|
+
camps" apart from a real `depression`/`prison` hit) without opening
|
|
205
|
+
the source file.
|
|
206
|
+
- Report: reordered review CSV columns so `severity`, `category`,
|
|
207
|
+
`snippet`, and `matched_term` -- the primary things a reviewer reads
|
|
208
|
+
to make a keep/redact decision -- sit right after `name`, ahead of
|
|
209
|
+
the disambiguation and cross-reference columns that are only needed
|
|
210
|
+
occasionally.
|
|
211
|
+
|
|
212
|
+
## [0.1.1] - 2026-07-19
|
|
213
|
+
|
|
214
|
+
### Fixed
|
|
215
|
+
|
|
216
|
+
- Parser: an unhandled level-1 GEDCOM tag (e.g. `CHAN`, the
|
|
217
|
+
record-last-modified tag present in almost every real export) left
|
|
218
|
+
stale birth/death event context in place, so its DATE/PLAC children
|
|
219
|
+
could silently overwrite `birth_date`/`death_date`/`birth_place`/
|
|
220
|
+
`death_place` -- corrupting the disambiguation data the review CSV
|
|
221
|
+
depends on to tell same-named relatives apart.
|
|
222
|
+
- Redactor: `keep`/`redact`/`rewrite:` action matching is now
|
|
223
|
+
case-insensitive, and an unrecognized action value now raises an
|
|
224
|
+
error (and aborts before writing an output file) instead of
|
|
225
|
+
silently defaulting to "keep" -- previously a typo in the reviewed
|
|
226
|
+
CSV could leave a flagged note un-redacted with no warning.
|
|
227
|
+
|
|
228
|
+
### Added
|
|
229
|
+
|
|
230
|
+
- Regression tests for both fixes (`tests/test_pipeline.py`).
|
|
231
|
+
|
|
232
|
+
## [0.1.0] - 2026-07-18
|
|
233
|
+
|
|
234
|
+
### Added
|
|
235
|
+
|
|
236
|
+
- Initial Python CLI: `scan` and `redact` commands, keyword-based
|
|
237
|
+
scanner, CSV review report, GEDCOM parser (INDI notes, CONT/CONC
|
|
238
|
+
continuation lines).
|
|
239
|
+
- Parser: FAM record resolution (parents/spouses), vital dates/places,
|
|
240
|
+
and identifier extraction (`_FSFTID`, `_FGRAVE`, `AFN`, `REFN`) for
|
|
241
|
+
disambiguating same-named individuals -- populated only when present
|
|
242
|
+
in the source file, never inferred.
|
|
243
|
+
- Test suite covering parsing, disambiguation, and scanning
|
|
244
|
+
(`tests/test_pipeline.py`).
|
|
245
|
+
- ADR-001 through ADR-005 recorded (see `docs/adr/`).
|
|
246
|
+
- Web proof-of-concept built as a React/JS Claude Artifact: full scan
|
|
247
|
+
pipeline running client-side (File API, no upload), per-row
|
|
248
|
+
keep/redact/rewrite actions, CSV and cleaned-GEDCOM export. Stored
|
|
249
|
+
at `web/reference/` as the spec to port into the real TypeScript
|
|
250
|
+
project (ADR-005, action items still open).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Vashon Software
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: gedcom-privacy-guard
|
|
3
|
+
Version: 0.4.0b1
|
|
4
|
+
Summary: Flag sensitive notes in a GEDCOM export for human review before you upload a family tree.
|
|
5
|
+
Project-URL: Repository, https://github.com/VashonSoftware-com/gedcom-privacy-guard
|
|
6
|
+
Project-URL: Changelog, https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/CHANGELOG.md
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Keywords: gedcom,genealogy,privacy,redaction
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Topic :: Sociology :: Genealogy
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Requires-Dist: openpyxl>=3.1
|
|
18
|
+
Requires-Dist: pyyaml>=6.0
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
|
|
21
|
+
# GEDCOM Privacy Guard
|
|
22
|
+
|
|
23
|
+
Before you upload a family tree, find the notes that shouldn't go with
|
|
24
|
+
it: mental illness, addiction, crime, family rumors, ID numbers, phone
|
|
25
|
+
numbers and your own contact details. It works with a GEDCOM export from
|
|
26
|
+
any genealogy program (Legacy, RootsMagic, Family Tree Maker, Gramps,
|
|
27
|
+
Ancestry…).
|
|
28
|
+
|
|
29
|
+
It **flags, you decide.** Your review goes in a spreadsheet, and only the
|
|
30
|
+
changes you approve are written, to a *new* file. Your original export is
|
|
31
|
+
never changed, and nothing leaves your computer.
|
|
32
|
+
|
|
33
|
+
> **Help wanted:** we've tested exports from Legacy only. If you use
|
|
34
|
+
> RootsMagic, Family Tree Maker, Gramps, Ancestry or another program,
|
|
35
|
+
> [send a made-up sample or try the 15-minute test](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/help-wanted.md).
|
|
36
|
+
|
|
37
|
+

|
|
38
|
+
|
|
39
|
+
## Install
|
|
40
|
+
|
|
41
|
+
You need Python 3.10 or later ([python.org](https://www.python.org/downloads/);
|
|
42
|
+
on Windows, tick *Add python.exe to PATH*). Then:
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
python -m pip install --user pipx
|
|
46
|
+
python -m pipx ensurepath
|
|
47
|
+
pipx install gedcom-privacy-guard
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Open a new terminal afterwards so the command is found.
|
|
51
|
+
|
|
52
|
+
## Use it
|
|
53
|
+
|
|
54
|
+
1. **Export** a GEDCOM file from your program
|
|
55
|
+
([how, for each program](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/exporting.md)).
|
|
56
|
+
2. **Scan** it:
|
|
57
|
+
|
|
58
|
+
```powershell
|
|
59
|
+
gedcom-privacy-guard scan my-tree.ged
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
3. **Review** `review.xlsx`. Each row is one hit, with the matched words
|
|
63
|
+
highlighted and enough about the person (dates, parents, spouses, IDs)
|
|
64
|
+
to tell relatives of the same name apart. Pick an action in the first
|
|
65
|
+
column: `keep`, `redact` (replace the note), `rewrite:your wording`, or
|
|
66
|
+
`privatize` (Legacy users only; see [legacy.md](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/legacy.md)).
|
|
67
|
+
4. **Write** the cleaned copy:
|
|
68
|
+
|
|
69
|
+
```powershell
|
|
70
|
+
gedcom-privacy-guard redact my-tree.ged --report review.xlsx
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Upload `cleaned.ged`. If your tree lives on Ancestry, fix the notes
|
|
74
|
+
there instead; [here's why](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/exporting.md#trees-that-live-on-a-website).
|
|
75
|
+
|
|
76
|
+
Try it first on the sample in this repo, `sample_data/sample.ged`.
|
|
77
|
+
|
|
78
|
+
## Choose how cautious
|
|
79
|
+
|
|
80
|
+
`--preset open` flags only ID numbers and contact details; `standard`
|
|
81
|
+
(the default) adds health, addiction, crime and rumor; `cautious` adds
|
|
82
|
+
adoption, illness and addresses. To add your own words or switch
|
|
83
|
+
categories off, run `gedcom-privacy-guard editor`, or see
|
|
84
|
+
[docs/RULES.md](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/RULES.md).
|
|
85
|
+
|
|
86
|
+
## Why your data is safe
|
|
87
|
+
|
|
88
|
+
It runs only on your computer. It has no server, no account and no
|
|
89
|
+
network code, and tests check that on every change by running it with
|
|
90
|
+
the network blocked. Turn off Wi-Fi and it works the same.
|
|
91
|
+
[More, including where your data *can* still go](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/safety.md).
|
|
92
|
+
|
|
93
|
+
## Limits
|
|
94
|
+
|
|
95
|
+
- **It matches words, not meaning.** "She took her own life" isn't
|
|
96
|
+
flagged; *suicide* is. Skim your notes yourself too.
|
|
97
|
+
[How it decides](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/how-it-works.md).
|
|
98
|
+
- **It never decides for you.** Every hit waits for your choice.
|
|
99
|
+
- **It doesn't touch names, dates or places.** A garbled place came from
|
|
100
|
+
the program that made the file.
|
|
101
|
+
- **It doesn't yet check for living people.** That's planned.
|
|
102
|
+
- A private online tree still shows every note to the people you invite
|
|
103
|
+
([what a private tree doesn't cover](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/exporting.md#what-a-private-tree-doesnt-cover)).
|
|
104
|
+
|
|
105
|
+
## More
|
|
106
|
+
|
|
107
|
+
[How it works] ·
|
|
108
|
+
[Why it's safe] ·
|
|
109
|
+
[Help wanted] ·
|
|
110
|
+
[Exporting] ·
|
|
111
|
+
[Legacy users] ·
|
|
112
|
+
[Your own rules] ·
|
|
113
|
+
[Architecture] ·
|
|
114
|
+
[Roadmap] ·
|
|
115
|
+
[Contributing] ·
|
|
116
|
+
[Security]
|
|
117
|
+
|
|
118
|
+
MIT licensed. A [Vashon Software](https://vashonsoftware.com) project.
|
|
119
|
+
|
|
120
|
+
[How it works]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/how-it-works.md
|
|
121
|
+
[Why it's safe]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/safety.md
|
|
122
|
+
[Help wanted]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/help-wanted.md
|
|
123
|
+
[Exporting]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/exporting.md
|
|
124
|
+
[Legacy users]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/legacy.md
|
|
125
|
+
[Your own rules]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/RULES.md
|
|
126
|
+
[Architecture]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/ARCHITECTURE.md
|
|
127
|
+
[Roadmap]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/ROADMAP.md
|
|
128
|
+
[Contributing]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/CONTRIBUTING.md
|
|
129
|
+
[Security]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/SECURITY.md
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# GEDCOM Privacy Guard
|
|
2
|
+
|
|
3
|
+
Before you upload a family tree, find the notes that shouldn't go with
|
|
4
|
+
it: mental illness, addiction, crime, family rumors, ID numbers, phone
|
|
5
|
+
numbers and your own contact details. It works with a GEDCOM export from
|
|
6
|
+
any genealogy program (Legacy, RootsMagic, Family Tree Maker, Gramps,
|
|
7
|
+
Ancestry…).
|
|
8
|
+
|
|
9
|
+
It **flags, you decide.** Your review goes in a spreadsheet, and only the
|
|
10
|
+
changes you approve are written, to a *new* file. Your original export is
|
|
11
|
+
never changed, and nothing leaves your computer.
|
|
12
|
+
|
|
13
|
+
> **Help wanted:** we've tested exports from Legacy only. If you use
|
|
14
|
+
> RootsMagic, Family Tree Maker, Gramps, Ancestry or another program,
|
|
15
|
+
> [send a made-up sample or try the 15-minute test](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/help-wanted.md).
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
You need Python 3.10 or later ([python.org](https://www.python.org/downloads/);
|
|
22
|
+
on Windows, tick *Add python.exe to PATH*). Then:
|
|
23
|
+
|
|
24
|
+
```powershell
|
|
25
|
+
python -m pip install --user pipx
|
|
26
|
+
python -m pipx ensurepath
|
|
27
|
+
pipx install gedcom-privacy-guard
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Open a new terminal afterwards so the command is found.
|
|
31
|
+
|
|
32
|
+
## Use it
|
|
33
|
+
|
|
34
|
+
1. **Export** a GEDCOM file from your program
|
|
35
|
+
([how, for each program](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/exporting.md)).
|
|
36
|
+
2. **Scan** it:
|
|
37
|
+
|
|
38
|
+
```powershell
|
|
39
|
+
gedcom-privacy-guard scan my-tree.ged
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
3. **Review** `review.xlsx`. Each row is one hit, with the matched words
|
|
43
|
+
highlighted and enough about the person (dates, parents, spouses, IDs)
|
|
44
|
+
to tell relatives of the same name apart. Pick an action in the first
|
|
45
|
+
column: `keep`, `redact` (replace the note), `rewrite:your wording`, or
|
|
46
|
+
`privatize` (Legacy users only; see [legacy.md](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/legacy.md)).
|
|
47
|
+
4. **Write** the cleaned copy:
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
gedcom-privacy-guard redact my-tree.ged --report review.xlsx
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Upload `cleaned.ged`. If your tree lives on Ancestry, fix the notes
|
|
54
|
+
there instead; [here's why](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/exporting.md#trees-that-live-on-a-website).
|
|
55
|
+
|
|
56
|
+
Try it first on the sample in this repo, `sample_data/sample.ged`.
|
|
57
|
+
|
|
58
|
+
## Choose how cautious
|
|
59
|
+
|
|
60
|
+
`--preset open` flags only ID numbers and contact details; `standard`
|
|
61
|
+
(the default) adds health, addiction, crime and rumor; `cautious` adds
|
|
62
|
+
adoption, illness and addresses. To add your own words or switch
|
|
63
|
+
categories off, run `gedcom-privacy-guard editor`, or see
|
|
64
|
+
[docs/RULES.md](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/RULES.md).
|
|
65
|
+
|
|
66
|
+
## Why your data is safe
|
|
67
|
+
|
|
68
|
+
It runs only on your computer. It has no server, no account and no
|
|
69
|
+
network code, and tests check that on every change by running it with
|
|
70
|
+
the network blocked. Turn off Wi-Fi and it works the same.
|
|
71
|
+
[More, including where your data *can* still go](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/safety.md).
|
|
72
|
+
|
|
73
|
+
## Limits
|
|
74
|
+
|
|
75
|
+
- **It matches words, not meaning.** "She took her own life" isn't
|
|
76
|
+
flagged; *suicide* is. Skim your notes yourself too.
|
|
77
|
+
[How it decides](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/how-it-works.md).
|
|
78
|
+
- **It never decides for you.** Every hit waits for your choice.
|
|
79
|
+
- **It doesn't touch names, dates or places.** A garbled place came from
|
|
80
|
+
the program that made the file.
|
|
81
|
+
- **It doesn't yet check for living people.** That's planned.
|
|
82
|
+
- A private online tree still shows every note to the people you invite
|
|
83
|
+
([what a private tree doesn't cover](https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/exporting.md#what-a-private-tree-doesnt-cover)).
|
|
84
|
+
|
|
85
|
+
## More
|
|
86
|
+
|
|
87
|
+
[How it works] ·
|
|
88
|
+
[Why it's safe] ·
|
|
89
|
+
[Help wanted] ·
|
|
90
|
+
[Exporting] ·
|
|
91
|
+
[Legacy users] ·
|
|
92
|
+
[Your own rules] ·
|
|
93
|
+
[Architecture] ·
|
|
94
|
+
[Roadmap] ·
|
|
95
|
+
[Contributing] ·
|
|
96
|
+
[Security]
|
|
97
|
+
|
|
98
|
+
MIT licensed. A [Vashon Software](https://vashonsoftware.com) project.
|
|
99
|
+
|
|
100
|
+
[How it works]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/how-it-works.md
|
|
101
|
+
[Why it's safe]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/safety.md
|
|
102
|
+
[Help wanted]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/help-wanted.md
|
|
103
|
+
[Exporting]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/exporting.md
|
|
104
|
+
[Legacy users]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/legacy.md
|
|
105
|
+
[Your own rules]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/RULES.md
|
|
106
|
+
[Architecture]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/docs/ARCHITECTURE.md
|
|
107
|
+
[Roadmap]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/ROADMAP.md
|
|
108
|
+
[Contributing]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/CONTRIBUTING.md
|
|
109
|
+
[Security]: https://github.com/VashonSoftware-com/gedcom-privacy-guard/blob/main/SECURITY.md
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Architecture Decision Records
|
|
2
|
+
|
|
3
|
+
| # | Title | Status |
|
|
4
|
+
|---|---|---|
|
|
5
|
+
| [001](001-human-reviewed-flagging.md) | Human-reviewed flagging, never automated deletion | Accepted |
|
|
6
|
+
| [002](002-privatize-at-source.md) | Privatize at the source (Legacy), not only at export time | Accepted |
|
|
7
|
+
| [003](003-reject-automated-reimport.md) | Reject automated reimport/merge into Legacy | Accepted |
|
|
8
|
+
| [004](004-dual-track-platform-architecture.md) | Dual-track architecture — Python CLI + browser-based web app | Accepted |
|
|
9
|
+
| [005](005-web-stack-and-hosting.md) | Web track stack — React + TypeScript + Vite → Cloudflare Pages | Accepted |
|
|
10
|
+
| [006](006-xlsx-review-report-with-highlighting.md) | Switch review report from CSV to XLSX for rich-text highlighting | Accepted |
|
|
11
|
+
| [007](007-shared-privacy-rules.md) | One privacy rules document and policy file, shared with family site builds | Accepted |
|
|
12
|
+
| [008](008-time-windows.md) | Time windows: 110-year proof, 1-year recently deceased, 3-year ID-theft | Accepted |
|
|
13
|
+
| [009](009-rules-file-format.md) | Rules file format: built-ins plus overrides, presets, term modes | Accepted |
|
|
14
|
+
|
|
15
|
+
The rules themselves, with their reasons, are in [`../PRIVACY-RULES.md`](../PRIVACY-RULES.md).
|
|
16
|
+
|
|
17
|
+
New decisions get a new numbered file here, following the format in
|
|
18
|
+
`/mnt/skills/plugins/engineering:architecture/SKILL.md` (Context /
|
|
19
|
+
Decision / Options Considered / Trade-off Analysis / Consequences /
|
|
20
|
+
Action Items). Supersede, don't silently edit — if a later decision
|
|
21
|
+
reverses an earlier one, mark the old ADR's Status as `Superseded by
|
|
22
|
+
ADR-00X` rather than deleting it.
|
|
23
|
+
|
|
24
|
+
## Not yet decided (future ADR candidates)
|
|
25
|
+
|
|
26
|
+
- **AI-based scanning with user-adjustable sensitivity** — see the P3
|
|
27
|
+
item in [`ROADMAP.md`](../../ROADMAP.md). Deliberately not an ADR yet:
|
|
28
|
+
no decision has been made on storage, scope (global vs. per-category),
|
|
29
|
+
or how it reconciles with keyword-based severity. Write an ADR when
|
|
30
|
+
this is actually picked up, not before.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.4.0b1"
|