Changelog
=========

v0.0.0
------

- Initial release.

v0.0.1
------

- Added polls

v0.0.2
------

- Add `is_conversation_scraped` field to Tweets
- Add some new tombstone types: "tweet violated twitter rules", "account no longer exists"
- No longer re-download media content (tweet content, user profile / banner images) if not needed
- Download video thumbnail images as part of video downloading

v0.0.3
------

- Add video `duration` and `view_count` fields
- Add `--version` command line option
- Improve user image scraping for rando users (download less eagerly) to speed up browsing and save disk space:
	- Download tiny versions of profile images (48x48 pixels)
	- Don't download banner images at all

v0.0.4
------

- Escape HTML entities in tweet text
- Add support for banned users
- Improve tombstone recognition (quote-tweets)
- Fix spacing issue around tiny profile images

v0.0.5
------

- BUGFIX: fix parsing of tweet URLs with query params ('?s=20', etc)
- BUGFIX: fix bug in scraping users with "600x200" banner images that caused them not to be saved correctly

v0.1.0
------

- Add support for new GraphQL twitter API (dubbed "APIv2" in code).  User feed scraping now uses this API
- Embedded links (URLs) now have their short versions saved in the DB.

v0.1.1
------

- BUGFIX: fix selection of primary "TimelineAddEntries" field in APIv2 following breaking API change
- Add `-h, --help` command line flags to display help message and gracefully exit

v0.1.2
------

- BUGFIX: fix error when trying to match mixed-case user handles in tombstone tweets
- BUGFIX: set "Client Language" header to "English" in all cases
- Add an option to show debug logging; hide it by default

v0.1.3
------

- Add following users
- Add `list_followed` subcommand
- Add support for tweets that quote-tweet something from a user who deleted their account

v0.1.4
------

- BUGFIXES: Fixed some annoying bugs caused by Twitter's poor API
	- ignore empty entries in a user feed instead of crashing
	- quote tweets no longer include their quoted tweet as an embedded link

v0.1.5
------

- BUGFIX: users changing their profile images should be not broken now
- Major refactoring (testing, massive linting improvements, proper Go dependencies like sqlx, etc)
- Improve tombstone handling
	- Update tweet content when a tombstone becomes available
	- Update tombstone type of a tweet if it changes
	- If a tweet gets hidden / deleted, it can become a tombstone without losing its content
- Enable support for users that change their handles

v0.1.6
------

- Add support for `mobile.twitter.com` tweet URLs
- Add basic support for Spaces (i.e., can now basically detect whether a tweet links to a Space or not)

v0.1.7
------

- Add support for multiple videos as well as videos and images in the same tweet
- Restructure media file storage into sub-directories to improve performance when retrieving them

v0.1.8
------

- Add proper support for fetching Spaces (with full detail)
- Add checking for DMCA takedowns of video content
- Add index for fetching tweet threads (index `in_reply_to_id`)
- Add indexes to tweet content types to improve fetching performance (index `tweet_id`)
- BUGFIX: can now fetch retweets with "visibility results"
- BUGFIX: search changed how cursors work at end-of-feed

v0.2.0
------

- Add index on tweets user_id column to accelerate loading of user feeds
- Implement login and authenticated requests!

v0.2.1
------

- BUGFIX: fix cursors being broken in authenticated sessions
- BUGFIX: fix stats for likes, RTs, etc. getting erased if a tweet gets deleted or hidden
- BUGFIX: `fetch_tweet` and `search` subcommands no longer ignore the `-n [number]` flag
- ".session" extension for the `--session` flag is now optional, allowing tab-autocompletion

v0.2.2
------

- Add support for Expandable (i.e., "Show more") tweets
- Fix an issue with half the tweets on user feeds not getting fetched while logged in

v0.3.0
------

- Now use APIv2 for Tweet Detail pages as well as user feeds.
- BUGFIX: fix a lot of bugs that were unfixable using the old API
- BUGFIX: fix spaces not updating ended_at time

v0.3.1
------

- HOTFIX: it looks like Twitter changed the label for a timeline module from "homeConversation" to "profile-conversation"!

v0.3.2
------

- BUGFIX: fix duplicate space participants bug (participants in a space should be unique)
- Add fetching of a user's Likes tab
- Implement "liking" and "unliking"

v0.4.0
------

- Add Web front-end served by `twitter webserver`
- Some small improvements to scraping of Spaces

v0.4.1
------

- BUGFIX: fix Spaces showing times 50,000 years in the future (timestamps in millis rather than seconds)
- Few UI improvements
	- fix link preview images overflowing the feed column
	- removed gray thread-connector line showing up in QTs
- Make the search bar work for searches
- Add scraper request for HomeTimeline

v0.4.2
------

- BUGFIX: fix long tweets displaying with paragraphs in wrong order
- BUGFIX: fix scrolling issues when using "back" button / history
- Search bar improvements:
	- can now paste twitter.com / mobile.twitter.com links into the search bar
	- go directly to user feed by entering "@elonmusk" (for example)
- UI improvements:
	- Make entities (#hashtags, @mentions) clickable in tweets and user bios
	- Make tombstones show
	- Other misc improvements
- Add manual re-scrape button to user feeds
- Add automatic timeline scraping in background when logged in

v0.5.0
------

- Add support for user "likes"
	- Logged-in user's "liked" tweets show filled-in heart in the UI
	- Can "like" (and "unlike") a tweet by clicking on its heart icon
- UI improvements:
	- Show entire threads in UI
	- Add tabs to User Feed: "Tweets", "Tweets with replies", "Media", "Likes"
	- Search now supports sort orders: most recent, least recent, most likes, most retweets
- Add support for a number of upstream stuff: "x.com" links, "Tweets" renamed to "Posts", new API formats, edited tweets
- Bugfixes

v0.5.1
------

- Add a preliminary Lists page which shows all offline-follows
- Add search page support for searching users
- Automatic background scraping of logged-in user's Likes

v0.6.0
------

- Add DMs
- Bugfixes:
	- Fix crashing because of the composer button when scraping logged-in user's threads
	- Fix crashing when loading the user feed of a user who isn't scraped yet
- UI improvements:
	- Make page loads much faster by moving image/video downloading to non-blocking background tasks
	- Get rid of dropdown button on tweets (buttons are just inline now)

v0.6.1
------

- UI improvements:
	- add the `--auto-open` flag for `twitter webserver` which opens the homepage in a browser on launch
	- search bar preserves its text between searches
	- spinner now shows when loading / fetching tweets
	- on errors, an error toast notification now shows
- Add followers/followees pages and queries

v0.6.2
------

- make all timestamps across the app use milliseconds (previously used both seconds or milliseconds in different places)
- add `get_user_likes_all` subcommand
- UI improvements:
	- make end-of-feed indicator look better
	- add favicon
- Bugfixes:
	- fix clobbering of interaction stats if a tweet is deleted (previously they'd all get set to 0)
	- fix double HTMX spinner on tweets with quoted tweet
	- fix focused tweets being clickable

v0.6.3
------

- Add Lists
- Add `--default-profile` flag which will use and create a profile in a default location (based on OS)
- UI improvements:
	- make scrolling in DMs work way better
	- hovering over a tweet now highlights it with a light background color
- Create a `Twitter.desktop` file in dpkg build

v0.6.4
------

- Can now re-scrape search results from the web UI
- UI improvements:
	- feed "Show More" button looks nicer
	- online-login form now has a HTMX spinner
- Login flow improved:
	- now auto-scrapes timeline and list of people you follow after logging in
	- command-line supports 2FA challenges
	- web UI notifies login failure if challenged for 2FA instead of failing silently
- Home page now has a "User Feed" timeline (shows people logged-in user follows) in addition to the "Offline Timeline"

v0.6.5
------

- UI improvements:
	- Add image full-size on-click viewer
- Add images, videos and links to DMs

v0.6.6
------

- BUGFIX: fix server crashing if a media download HTTP request times out
- BUGFIX: scraping user feeds now gets long tweets properly
- UI improvements:
	- Fix image sizing issues in link preview images and DM images
- Add support for pinned tweets (both fetching and displaying)
- New search bar filters: "tombstone:<tombstone_type>" and "followed_by:<userhandle>"
- Add boilerplate for Progressive Web App

v0.6.7
------

- UI improvements:
	- various bugfixes
	- make tweets take up less space
- Add "list:<id>" search bar filter
- BUGFIX: Fix pinned tweets with a quoted-tweet not showing the quoted tweet

v0.6.8
------

- UI improvements:
	- fix some buggy styling around the pin icon on pinned tweets and error toast messages
- BUGFIX: fix scraper crashing when a media download times out (e.g., long video)

v0.6.9
------

- UI improvements:
	- GIFs now show differently than videos; can be paused and restarted on click
	- Add unread indicators to DMs, and show unread messages count in nav sidebar
	- DM messages now have a message preview if the last message was just an attachment (image, tweet, or video)

v0.6.10
-------

- UI improvements:
	- add "Copy Link" button to tweets
	- add "Go Online" button to nav sidebar
	- add header section for DMs with open-in-external button
	- Clicking on the "replying-to" button on a DM scrolls that message into view
- Add DM pagination / show-more button

v0.6.11
-------

- Add 2 buttons in DM chat header: mark as "read", manually re-scrape
- DM list now updates itself live while on the Messages page

v0.6.12
-------

- Add support for scraping bookmarks (not making them, yet)
- Publish statically linked builds only
- Various minor bugfixes

v0.6.13
-------

- BUGFIX: no longer throws away all scrape results if a pagination request gets rate-limited
- BUGFIX: can now start the webserver without an internet connection
- UI improvements:
	- image carousel now closes if you click outside of it
