You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This document was inferred from the actual JSONL file at backend/data/data.jsonl, not from assumptions.
Dataset Shape
File format: JSONL
Row count: 8,799
Root object shape: {"kind": "t3", "data": {...}}
Observed root kinds: only t3
Interpretation: every row is a Reddit submission/post object, not a mixed-platform or mixed-entity corpus
Total distinct keys under data: 114
Keys present on every row: 97
1. Field-By-Field Schema Summary
Root-Level Fields
Raw field
Presence
Type(s)
Notes
kind
8,799 / 8,799
str
Always t3, meaning Reddit link/self post
data
8,799 / 8,799
dict
Full Reddit submission payload
Core Post Identity And Time
Raw field
Presence
Type(s)
Notes
id
8,799 / 8,799
str
Stable Reddit post id without t3_ prefix
name
8,799 / 8,799
str
Full Reddit thing id, usually t3_<id>
created
8,799 / 8,799
float
Unix timestamp in seconds
created_utc
8,799 / 8,799
float
UTC Unix timestamp in seconds; best canonical time field
edited
8,799 / 8,799
bool, float
false when not edited; timestamp when edited
permalink
8,799 / 8,799
str
Relative Reddit path
url
8,799 / 8,799
str
External URL for link posts, Reddit URL for self posts
domain
8,799 / 8,799
str
Link domain; self.<subreddit> for self posts; 89 empty strings
Core Content Fields
Raw field
Presence
Type(s)
Notes
title
8,799 / 8,799
str
Always populated; primary text for all posts
selftext
8,799 / 8,799
str
Present but empty on 5,891 rows; non-empty on 2,903 rows
selftext_html
8,799 / 8,799
str, None
HTML rendering of selftext; non-null on 2,908 rows
is_self
8,799 / 8,799
bool
True on 2,059 rows; matches self-post behavior
thumbnail
8,799 / 8,799
str
Often sentinel values like default, self, image; 116 empty strings
preview
6,239 / 8,799
dict
Image preview metadata when available
media
8,799 / 8,799
dict, None
Non-null on 548 rows; embedded media such as YouTube
secure_media
8,799 / 8,799
dict, None
Secure version of media payload; same sparsity as media
media_metadata
163 / 8,799
dict
Gallery/media asset metadata
gallery_data
147 / 8,799
dict
Gallery item ordering and ids
Author And Community Fields
Raw field
Presence
Type(s)
Notes
author
8,799 / 8,799
str
Main visible username; 120 [deleted] values
author_fullname
8,679 / 8,799
str, missing
Stable Reddit user thing id when available
subreddit
8,799 / 8,799
str
Community name
subreddit_id
8,799 / 8,799
str
Stable Reddit subreddit id
subreddit_name_prefixed
8,799 / 8,799
str
Usually r/<subreddit>
subreddit_type
8,799 / 8,799
str
Community visibility/type
author_flair_text
8,799 / 8,799
str, None
Non-null on 2,753 rows; 30 empty strings
author_flair_richtext
8,799 / 8,799
list
Usually empty
author_flair_text_color
8,799 / 8,799
str, None
Optional flair metadata
author_flair_background_color
8,799 / 8,799
str, None
Optional flair metadata
author_flair_template_id
8,799 / 8,799
str, None
Optional flair metadata
author_flair_type
8,799 / 8,799
str
Flair rendering mode
link_flair_text
8,799 / 8,799
str, None
Non-null on 5,863 rows
link_flair_richtext
8,799 / 8,799
list
Usually empty
link_flair_text_color
8,799 / 8,799
str, None
Optional
link_flair_background_color
8,799 / 8,799
str, None
Optional
link_flair_css_class
8,799 / 8,799
str, None
Optional legacy flair field
link_flair_type
8,799 / 8,799
str
Flair rendering mode
Engagement And Ranking Fields
Raw field
Presence
Type(s)
Notes
score
8,799 / 8,799
int
Net score
ups
8,799 / 8,799
int
Upvotes snapshot
downs
8,799 / 8,799
int
Always present; not always meaningful on Reddit APIs
upvote_ratio
8,799 / 8,799
float
Ratio of positive votes
num_comments
8,799 / 8,799
int
Comment count
total_awards_received
8,799 / 8,799
int
Award count
gilded
8,799 / 8,799
int
Legacy gilding count
gildings
8,799 / 8,799
dict
Award details map
all_awardings
8,799 / 8,799
list
Award detail objects
awarders
8,799 / 8,799
list
Usually empty
Visibility, Moderation, And State Fields
Raw field
Presence
Type(s)
Notes
saved
8,799 / 8,799
bool
Viewer-specific state; not useful as dataset fact
clicked
8,799 / 8,799
bool
Viewer-specific state
hidden
8,799 / 8,799
bool
Viewer-specific state
archived
8,799 / 8,799
bool
Post state
locked
8,799 / 8,799
bool
Moderation state
stickied
8,799 / 8,799
bool
Moderator-pinned in subreddit listing
pinned
8,799 / 8,799
bool
Additional pinned flag
spoiler
8,799 / 8,799
bool
Content warning flag
over_18
8,799 / 8,799
bool
NSFW flag
quarantine
8,799 / 8,799
bool
Community quarantine flag at post snapshot time
is_meta
8,799 / 8,799
bool
Reddit metadata classification
is_original_content
8,799 / 8,799
bool
OC flag
is_crosspostable
8,799 / 8,799
bool
Crosspost policy
can_mod_post
8,799 / 8,799
bool
Viewer/mod capability flag
is_created_from_ads_ui
8,799 / 8,799
bool
Mostly irrelevant for analysis
send_replies
8,799 / 8,799
bool
User preference flag
is_video
8,799 / 8,799
bool
Video flag
is_gallery
8,799 / 8,799
bool
Gallery indicator
is_reddit_media_domain
8,799 / 8,799
bool
Helpful for distinguishing hosted media
is_robot_indexable
8,799 / 8,799
bool
Crawlability flag
visited
8,799 / 8,799
bool
Viewer-specific state
no_follow
8,799 / 8,799
bool
Link annotation
hide_score
8,799 / 8,799
bool
UI flag
Nested And Relationship Fields
Raw field
Presence
Type(s)
Notes
crosspost_parent
238 / 8,799
str
Parent Reddit thing id for crossposts
crosspost_parent_list
238 / 8,799
list
Embedded parent-post objects; one row had empty list
media_embed
8,799 / 8,799
dict
Usually empty dict
secure_media_embed
8,799 / 8,799
dict
Usually empty dict
preview.images
nested
list
Preview images with source and resolutions
gallery_data.items
nested
list
Gallery asset ordering
media_metadata.*
nested
dict
Media attributes keyed by asset id
Sparse Or Mostly-Irrelevant Reddit API Fields
These fields exist, but are implementation noise for this app unless a specific feature needs them:
approved_at_utc
approved_by
banned_at_utc
banned_by
category
content_categories
discussion_type
likes
mod_note
mod_reason_by
mod_reason_title
num_reports
removed_by
report_reasons
top_awarded_type
view_count
pwls
treatment_tags
user_reports
mod_reports
removal_reason
allow_live_comments
contest_mode
wls
whitelist_status
parent_whitelist_status
thumbnail_height
thumbnail_width
suggested_sort
author_premium
distinguished
post_hint
url_overridden_by_dest
Several of these are always null; others are operational Reddit flags rather than meaningful investigative features.
2. Recommended Canonical Internal Model
The source file is a post-centric Reddit export. The cleanest app model is normalized around Post, with linked Author, Community, Link, Entity, and derived analysis metadata.
Canonical Post
Post
- post_id: str # from data.id
- platform: Literal["reddit"]
- platform_item_id: str # from data.name (t3_xxx)
- source_kind: Literal["submission"]
- created_at: datetime # from created_utc
- edited_at: datetime | None # from edited if numeric
- title: str
- body_text: str | None # normalized selftext
- full_text: str # title + "\n\n" + body_text when body exists
- permalink_url: str # https://www.reddit.com + permalink
- canonical_url: str # external url if link post else permalink_url
- domain: str | None
- is_self_post: bool
- language: str | None # derived later if needed
- subreddit_id: str
- subreddit_name: str
- subreddit_label: str # r/<name>
- author_id: str | None # from author_fullname
- author_username: str
- score: int
- upvotes: int
- downvotes: int
- upvote_ratio: float | None
- comment_count: int
- award_count: int
- is_nsfw: bool
- is_spoiler: bool
- is_locked: bool
- is_stickied: bool
- is_pinned: bool
- is_archived: bool
- flair_text: str | None
- flair_type: str | None
- preview_image_url: str | None # derived from preview/source
- media_type: str | None # derived: image / video / youtube / gallery / link / self
- thumbnail_url: str | None # only if thumbnail looks like real URL
- raw_json: dict # keep raw payload for debugging/edge features
Legacy or low-value Reddit internals: pwls, wls, whitelist_status, parent_whitelist_status
Empty or nearly-empty fields: category, content_categories, discussion_type, likes, top_awarded_type, view_count
5. Dataset Risks And Quirks For Analytics Features
Search
The corpus is Reddit submissions only, so any “platform” abstraction should currently resolve to Reddit communities, not multiple social networks.
full_text must use title + selftext; relying on selftext alone would discard most rows because 5,891 posts have empty bodies.
Hashtags are not a native source field. Any hashtag search/filter is derived and will be sparse; only 177 posts contained regex-detectable hashtags in title/body.
Many self posts have Reddit permalink-style url values, so URL-based filtering must distinguish external URLs from Reddit internal links.
Clustering / Embeddings
Titles dominate many rows because body text is frequently empty. Topic clusters may therefore skew toward headline phrasing rather than long-form argumentation.
Crossposts and repeated news-link titles can create near-duplicate semantic clusters.
Flair fields are tempting topical features, but they are community-specific and noisy; use them as auxiliary labels, not primary semantic content.
Media-heavy posts may contain little textual evidence even when analytically important.
Time-Series
created_utc is the correct time field; created appears redundant and should not be treated as a separate timeline.
Engagement metrics are snapshot values, not event histories. score, ups, and num_comments reflect crawl-time state, not longitudinal evolution.
Stickied/pinned posts can distort activity summaries if treated the same as ordinary posts.
Network Analysis
There is no native mention/reply graph in the submission data. Author networks, hashtag networks, and link co-occurrence networks must be inferred.
crosspost_parent and crosspost_parent_list provide a real relationship signal, but only for 238 rows.
Author identity is imperfect because author_fullname is missing on some rows and author includes [deleted] accounts.
Domain networks are likely stronger than hashtag networks because outbound URLs are common while hashtags are rare.
General Data-Model Risks
The dataset is strongly Reddit-specific, so any canonical model should preserve platform-specific raw payloads instead of over-normalizing into a fake universal schema.
Several fields are operational Reddit API metadata rather than stable content facts. Pulling too many of them into search or clustering will add noise.
edited is mixed-type (false or timestamp), so strict typing must normalize it before validation.
thumbnail is not a reliable image URL field because Reddit uses sentinel strings such as self, default, and image.
Recommended Implementation Direction
For this app, the most practical ingestion pipeline is:
Flatten each JSONL row to the data object.
Normalize into canonical Post, Author, Community, Link, and PostMetadata records.
Derive full_text, hashtags, entities, media_type, and preview_image_url.
Keep the original Reddit payload in raw_json for edge cases and future features.
Treat search, clustering, time-series, and network views as analysis layers built on top of the canonical post table, not on raw Reddit fields directly.