Ask HN: Do you have more or less than 1Mb text of your own writing?
4 points
12 hours ago
| 5 comments
| HN
Of all that you have written in ypur lifetime, do you have in your possession more or less than 1Mb (180,000 words) of text?

Printed, blogged, work-related, personal diary, fiction practice, emails you personally wrote (not so much copies of boilerplate, or coauthoring when added for other reasons than actual written words).

Asking out of curiosity.

KashifNY
12 hours ago
[-]
Yes i do, i like to put down my thoughts in writing as well as planning out strategies and such as i found out that i could not find a pen when i needed it much which was a dilemma of mine and so i started just using my laptop and phone to jot down what came to mind and was worth recording
reply
cwmoore
9 hours ago
[-]
How much more than 1Mb, do you know?
reply
cwmoore
5 hours ago
[-]
50 years of one 50 word grocery list per week (if you keep them) is 130,000 words, but not everyone writes that much, or that consistently, or for that long, or keeps complete digital copies.
reply
Bender
11 hours ago
[-]
Some here probably have more than 1mb in comments. There's probably a way to calculate that through the API if someone were so inclined.
reply
eth0up
9 hours ago
[-]
I just pinged the api to dump my 10 year comment history. Yes, that definitely can be done, in a few seconds and a script.

Edit: the csv = 698kb and the json = 866kb Edit 2: api was the wrong term. I used algolia.

reply
cwmoore
9 hours ago
[-]
Great datapoint, thanks.

My “Ask HN” was not intended to focus on HN comment writing only, but since it headed that way on its own, can you share a scriptlet so that others may do more than speculate?

reply
eth0up
9 hours ago
[-]
You ok with python?
reply
Bender
5 hours ago
[-]
eth0up your last comment went auto-[dead] probably because of the python. I vouched for it, think that much worked.

I would just grab it and add to a text file URL but python cares about spaces and the script is not consistently indented 4 spaces to make it into HN code. Do you by chance have a git repo you can save it to?

Another option is to sftp it to hn@nochan.net (no password), put in /pub/ and I can turn it into a URL. If you can reach it.

reply
cwmoore
8 hours ago
[-]
I am
reply
eth0up
7 hours ago
[-]
#!/usr/bin/env python3

""" WARNING: For use on mortals only -- WIll break on tptacek and other mutant laureates """

  import argparse
import csv import json import sys import time from pathlib import Path

import requests

API = "https://hn.algolia.com/api/v1/search_by_date" HITS_PER_PAGE = 1000 ALGOLIA_DEEP_PAGE_LIMIT = 10000 # page * hitsPerPage must remain <= this

def fetch_page(username, page, created_after=None, created_before=None): params = { "tags": f"comment,author_{username}", "hitsPerPage": HITS_PER_PAGE, "page": page, } filters = [] if created_after is not None: filters.append(f"created_at_i>{created_after}") if created_before is not None: filters.append(f"created_at_i<{created_before}") if filters: params["numericFilters"] = ",".join(filters)

    resp = requests.get(API, params=params, timeout=30)
    resp.raise_for_status()
    return resp.json()

def get_total_in_range(username, created_after=None, created_before=None): data = fetch_page(username, 0, created_after, created_before) return data["nbHits"], data

def dump_range(username, created_after, created_before, seen_ids, all_records, depth=0): """Recursively bisect time ranges to stay under Algolia's 10k page wall.""" total, first_page = get_total_in_range(username, created_after, created_before) indent = " " * depth lo = created_after if created_after is not None else "start" hi = created_before if created_before is not None else "now" print(f"{indent}Range [{lo} .. {hi}]: {total} comments")

    if total == 0:
        return

    max_reachable = ALGOLIA_DEEP_PAGE_LIMIT  # page*hitsPerPage cap
    if total <= max_reachable:
        # safe to page through directly
        page = 0
        while True:
            data = first_page if page == 0 else fetch_page(username, page, created_after, created_before)
            hits = data["hits"]
            if not hits:
                break
            new = 0
            for h in hits:
                if h["objectID"] not in seen_ids:
                    seen_ids.add(h["objectID"])
                    all_records.append({
                        "id": h["objectID"],
                        "author": h.get("author"),
                        "created_at": h.get("created_at"),
                        "created_at_i": h.get("created_at_i"),
                        "comment_text": h.get("comment_text"),
                        "story_id": h.get("story_id"),
                        "story_title": h.get("story_title"),
                        "story_url": h.get("story_url"),
                        "parent_id": h.get("parent_id"),
                        "points": h.get("points"),
                    })
                    new += 1
            print(f"{indent}  page {page}: +{new} (running total {len(all_records)})")
            if (page + 1) * HITS_PER_PAGE >= data["nbHits"]:
                break
            page += 1
            time.sleep(0.5)  # polite pacing, Be a nice human
    else:
        # bisect on time: find midpoint of range and recurse both halves
        lo_i = created_after if created_after is not None else 0
        # use "now" as a safe upper bound if open-ended
        hi_i = created_before if created_before is not None else int(time.time())
        mid = (lo_i + hi_i) // 2
        print(f"{indent}  -> exceeds {max_reachable}, bisecting at {mid}")
        dump_range(username, lo_i, mid, seen_ids, all_records, depth + 1)
        dump_range(username, mid, hi_i, seen_ids, all_records, depth + 1)

def main(): ap = argparse.ArgumentParser() ap.add_argument("username") args = ap.parse_args() username = args.username

    seen_ids = set()
    all_records = []

    print(f"Fetching full comment history for '{username}'...")
    dump_range(username, None, None, seen_ids, all_records)

    all_records.sort(key=lambda r: r.get("created_at_i") or 0)

    json_out = f"hn_comments_{username}.json"
    csv_out = f"hn_comments_{username}.csv"

    with open(json_out, "w", encoding="utf-8") as f:
        json.dump(all_records, f, indent=2, ensure_ascii=False)

    if all_records:
        fieldnames = list(all_records[0].keys())
        with open(csv_out, "w", newline="", encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(all_records)

    print(f"\nDone. {len(all_records)} total comments.")
    print(f"  -> {json_out}")
    print(f"  -> {csv_out}")

if __name__ == "__main__": main()
reply
dlcarrier
10 hours ago
[-]
It doesn't take long to build up that many words on online forums, like Hacker News.
reply
cwmoore
2 hours ago
[-]
The text content of my iOS Notes, when zipped, is about 500Kb. Some small fraction of that was copy-pasted from someone else’s writing.

I probably have an order of magnitude more than that.

Bigger than a context window, smaller than a useful model, and fits in L2 cache.

reply
cwmoore
9 hours ago
[-]
Thanks for your input. Apparently it does! There’s another commenter on this thread who found less than that in their 10 year history.
reply
billybuckwheat
10 hours ago
[-]
Far, far more than 1 MB.
reply
cwmoore
9 hours ago
[-]
Thanks, that’s a lot. Can I ask for a ballpark figure? And how you have written so much?
reply
eth0up
7 hours ago
[-]
In case you don't receive an answer, an alternative to whatever they might have said or not have said, is stupidly simple: Just force yourself to write. Sit down. Lay down, stand on your head. Just do what ever you need to do to force yourself to write. Small personal essays are my suggestion. And a tip: never pause to edit -- just keep writing until you tire, and only then, if you must, go back and scrutinize yourself.
reply
cwmoore
7 hours ago
[-]
Hah! Good advice!

What I was asking was for anyone, prolific at writing or or not, to understand their own output in relation to…L1 cache or a context window.

But thanks! I guess my issue with writing, as a complete amateur, is the later stages, and followup, compiling or reviewing. Reading is not the only reason to write, but it is an important one.

I think it is a relevant human-scale question, relating to and understanding a paltry personal megabyte (or less) on a forum where gigabyte models are half the conversation. Its the wrong metric in a way like LoC, to compare to your comment.

reply
eth0up
6 hours ago
[-]
If I am understanding correctly, you are also putting into perspective the dizzying contrast of human vs LLM, where the mere context window far exceeds an average lifetime of writing, which if so, yeah, ... interesting times. Before they ruined Claude with 4.7 and 5, I had more than a few extensive, hundred-page discussions which still kind of blow my mind in review. I miss it as I do some old departed friends. It would get quite amnesiac toward the ends, but still beat the hell out of many conversations I've had with PhDs.

On that note, my generated content, or product of my LLM interactions, exceeds 6GB, probably a lot more. Of course, on average, the LLM is producing far more output. But that's ~ two years of heavy, mostly research-based dialog, much of it adversarial, probing the frontier systems themselves.

reply
cwmoore
5 hours ago
[-]
Exactly right—interesting times. I’m curious whether you could estimate what percentage of the 6Gb sessions were your own writing? Of course you guide the ideas, but this word count is a different question from “how many words have you read?” (or generated, or conpiled from source :)
reply
senordevnyc
7 hours ago
[-]
Way way more. I write about that in journal entries alone per year
reply
cwmoore
5 hours ago
[-]
Thanks for the feedback! Sounds like you are prolific and consistent!

Do you write outside of journaling? Same amount?

reply