If not in full page, open in full page here: Notion Wrapped | github.com/jesenator/notion-wrapped | pypi.org/project/notion-wrapped
<aside> <img src="/icons/gift_orange.svg" alt="/icons/gift_orange.svg" width="40px" /> Notion Wrapped! (not affiliated with Notion) Given an API key and a starting page, Notion wrapped recurses through every sub-block, tallying them up, noting the words used, the block relationships, and more to create a visual history of your Notion in the form of numbers, plots, word clouds, and network graphs!
</aside>
<aside> <img src="/icons/fireworks_red.svg" alt="/icons/fireworks_red.svg" width="40px" />
Network graph of my entire Notion - all 96 thousand blocks
Click on an image to expand it
<aside> <img src="/icons/cloud_purple.svg" alt="/icons/cloud_purple.svg" width="40px" />
Word cloud of the top words in my 1,641,416 word Notion
<aside> <img src="/icons/checklist_yellow.svg" alt="/icons/checklist_yellow.svg" width="40px" />
pip install notion-wrapped
(make a Python environment first! - ask chatGPT how if you need help)notion-wrapped
with the required command line arguments (run notion-wrapped --help
for help)
analytics
folder!#NotionWrapped
and this page (jessewgilbert.com/notion-wrapped)!Btw: I don’t store or use any of your data!! It is all transient in the Python program
</aside>
<aside> <img src="/icons/calendar-month_green.svg" alt="/icons/calendar-month_green.svg" width="40px" />
Somehow there is a block in my Notion workspace created in 1970… Kind of messed up the visualization haha
After filtering out that block (and smoothing). This looks better :)
</aside>
<aside> <img src="/icons/pen_orange.svg" alt="/icons/pen_orange.svg" width="40px" />
blocks created by them / blocks last edited by them
- Jesse Gilbert: 85551 / 87865
- Liam: 692 / 547
- Notion Calendar: 602 / 0
- Julia: 554 / 406
- Lydia: 451 / 408
- Emma: 392 / 236
- Vanessa: 145 / 153
- Zapier: 102 / 0
...
<aside> <img src="/icons/mobile_yellow.svg" alt="/icons/mobile_yellow.svg" width="40px" />
</aside>
<aside> <img src="/icons/metronome_red.svg" alt="/icons/metronome_red.svg" width="40px" />
</aside>
<aside> <img src="/icons/timeline_blue.svg" alt="/icons/timeline_blue.svg" width="40px" />
Total Block Count:
96,328
Total Word Count:
1,641,416
Max Recursion Depth:
23
Time Spent on Notion Estimate:
1454 hours
/60 days
Average blocks created or edited per day:
126.33
Median blocks created or edited per day:
89
Days with zero blocks created or edited:
21
Total number of days using Notion:
1525
Program Execution time:
03:38:19.55
</aside>
<aside> <img src="/icons/sync-reverse_brown.svg" alt="/icons/sync-reverse_brown.svg" width="40px" />
recurse.py
classrecurse
gets the children of a certain block and recursively so it calls recurse
on each of the direct childrenrecurse
function in the form of a mapping function and reducing function parameters.
function
to the current blockcombines it (with some function)
with the output of step 1 or an initial value
if the existing output is None.<aside> <img src="/icons/search_pink.svg" alt="/icons/search_pink.svg" width="40px" />
analytics.py
classadd_block
function from analytics.py
as the mapping function in recurse.py
.
Terminal output - you can see the structure of the recursion here
</aside>
<aside> <img src="/icons/calendar-month_green.svg" alt="/icons/calendar-month_green.svg" width="40px" />
PyVis
spring lengths
, and spring constants
</aside>puppeteer
to load the webpage in headless mode, at a much larger sizenotion_wrapped.py
- makes the classes into an accessible command line toolutils.py
- various utilities used by both classesnotion_client.py
- all the code for interfacing with the Notion APIhttps://prismatic-parfait-599ad4.netlify.app/
I’m really happy how it came out. I love being able to walk up really close to it to see all the individual nodes and connections.