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.
Files changed (33) hide show
  1. gedcom_privacy_guard-0.4.0b1/.gitignore +17 -0
  2. gedcom_privacy_guard-0.4.0b1/CHANGELOG.md +250 -0
  3. gedcom_privacy_guard-0.4.0b1/LICENSE +21 -0
  4. gedcom_privacy_guard-0.4.0b1/PKG-INFO +129 -0
  5. gedcom_privacy_guard-0.4.0b1/README.md +109 -0
  6. gedcom_privacy_guard-0.4.0b1/docs/adr/README.md +30 -0
  7. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/__init__.py +1 -0
  8. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/__main__.py +6 -0
  9. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/cli.py +203 -0
  10. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/builtin-rules.js +191 -0
  11. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/editor.js +550 -0
  12. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/rules-editor.html +297 -0
  13. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/rules-engine.js +749 -0
  14. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/vendor/js-yaml-LICENSE.txt +21 -0
  15. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/editor/vendor/js-yaml.min.js +2 -0
  16. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/encoding.py +211 -0
  17. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/parser.py +405 -0
  18. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/redactor.py +209 -0
  19. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/report.py +470 -0
  20. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/rules.py +331 -0
  21. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/rules.yaml +196 -0
  22. gedcom_privacy_guard-0.4.0b1/gedcom_privacy_guard/scanner.py +206 -0
  23. gedcom_privacy_guard-0.4.0b1/pyproject.toml +65 -0
  24. gedcom_privacy_guard-0.4.0b1/sample_data/sample.ged +53 -0
  25. gedcom_privacy_guard-0.4.0b1/tests/conftest.py +27 -0
  26. gedcom_privacy_guard-0.4.0b1/tests/js/editor_harness.js +54 -0
  27. gedcom_privacy_guard-0.4.0b1/tests/test_editor.py +353 -0
  28. gedcom_privacy_guard-0.4.0b1/tests/test_encoding.py +97 -0
  29. gedcom_privacy_guard-0.4.0b1/tests/test_fuzz.py +102 -0
  30. gedcom_privacy_guard-0.4.0b1/tests/test_hardening.py +158 -0
  31. gedcom_privacy_guard-0.4.0b1/tests/test_no_network.py +142 -0
  32. gedcom_privacy_guard-0.4.0b1/tests/test_pipeline.py +413 -0
  33. 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
+ ![The rules editor, testing a note against the standard preset](https://raw.githubusercontent.com/VashonSoftware-com/gedcom-privacy-guard/main/docs/images/rules-editor.png)
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
+ ![The rules editor, testing a note against the standard preset](https://raw.githubusercontent.com/VashonSoftware-com/gedcom-privacy-guard/main/docs/images/rules-editor.png)
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"
@@ -0,0 +1,6 @@
1
+ import sys
2
+
3
+ from .cli import main
4
+
5
+ if __name__ == "__main__":
6
+ sys.exit(main())