- Update
masto.jsto 7.10.0 - Add new
quotesCountandquoteApprovalprops toTootclass
- Increase
config.toots.saveChangesIntervalSecondsto 30 seconds - (Demo App) Save timeline on page unload to preserve already seen status of toots in timeline
- More
tagOnlyStrings - Bump
js-yamlto 4.1.0 with npm audit fix - (Demo App) Bump
raw-bodyto 2.5.3,http-errorsto 2.0.1 withnpm audit fix
- Upgrade
js-yamlto 3.14.2 - More
tagOnlyStrings - (Demo App) Upgrade
js-yaml,node-forge,glob,minimatchwithnpm audit fix
- More
tagOnlyStrings
- Add image alt text to
Toot.contentWithCard()string, scan alt text when looking for hashtag matches
- Reduce
config.toots.maxAgeInDaysfrom 7 to 5
- Update
mastopackage to 7.3.0
- More
tagOnlyStrings
- (Demo App) Update browser list in
canius-lite
- (Demo App) Adjust tooltip text for autoload switch
- More
tagOnlyStrings
- Better fix for "always show followed" filter issue
- Fix issue where followed hashtags with 0 toots were showing up in filter list when sorted alphabetically with "always show followed" option enabled
- (Demo App) Fix hashtag filter section footer switch layout
- (Demo App) Fix layout for short but wide images in toots
- More
tagOnlyStrings
- Add
includeFollowedparam toBooleanFilterfunctions - (Demo App) Add switch for "Always Show Followed" to filters section
- (Demo App) Trigger error pop up when a
Tootfails to resolve to a URL on the user's homeserver
- More
tagOnlyStrings
- (Demo App) Logging change for poll response
- Logging of args for calls to
Logger.error() - More
tagOnlyStrings - (Demo App) Use branded mastodon favicon
- (Demo App) Log calls to
extractText()
- More
tagOnlyStrings
- (Demo App) Avoid endless loop when
Toot.resolve()fails inReplyModal
- More
tagOnlyStrings
- Increase
config.api.mutexWarnSecondsto 10 seconds
- (Demo App) Set favicon
- More
tagOnlyStrings
- Bump
axiosto 1.12.2 vianpm audit fix
- (Demo App)
persistentCheckbox()takes aGuiCheckboxNameargument
- (Demo App) Move default values for GUI checkboxes into
config.ts, change default forallowMultiSelecttofalse
- More
tagOnlyStrings
- (Demo App) Use
useAccordion()for custom API error accordion - Raise
config.toots.batchCompleteSleepBetweenMSfrom 150ms to 210ms because responsiveness is pretty impaired while running - More
tagOnlyStrings
- More
tagOnlyStrings
- (Demo App) Use an
Accordionfor non-fatal error warnings; refactorApiErrorsPanelcomponent
- More
tagOnlyStrings
- (Demo App) Set webpack's
devtooloption toundefinedfor production builds to remove source map frombundle.js(shrinks bundle from 15 MB to under 3MB) - (Demo App) Reenable PurgeCSS with more
safelistoptions
(Demo App) Revert PurgeCSS introduction because it's causing layout weirdness
- (Demo App) Add
media-galleryCSS classes to PurgeCSSsafelistto fix bug with images not displaying - Logging of env vars
- (Demo App)
npm run buildnow writesbundle.jstoprocess.env.BUILD_DIR
- (Demo App) Lock
bootstrapto version 5.2.3
- (Demo App) Use
PurgeCSSwebpack plugin to shrinkbundle.jsoutput
- (Demo App) Use CDN to deliver
bootstrap.min.css
- (Demo App) Use smaller
Showcase.jpgimage on landing screen instead of largerShowcase.pngversion
- Logging changes
- More
tagOnlyStrings
- Rename
MoarDataPollertoUserDataPoller
- More
tagOnlyStrings
- Push
MastodonServerscraping errors intoMastoApi.apiErrorsarray for display to user - Consolidate API error logging to new
MastoApi.recordApiError()method - (Demo App) Make non-fatal errors and warnings list yellow instead of red and smaller font
- More
tagOnlyStrings
- Refactor
AgeInhelper class to replaceageInSeconds(),ageInHours(), etc. and export it
- Add
debugWithTraceObjs()method toLoggerclass
- (Demo App) Adjust switchbar checkbox labels
- (Demo App) Move filter related switch checkboxes into the "Feed Filters" accordion section
- More
tagOnlyStrings
- (Demo App) Rename
Colored Filter Highlightsswitch
- Include cause of the error in
TheAlgorithm.apiErrorMsgsforErrorobjects with non-nullcauseproperty
- Ignore DMs in
MostRepliedAccountsScorerandMostFavouritedAccountsScorer - More
tagOnlyStrings
- More
tagOnlyStrings
- Double
config.api.maxSecondsPerPageto 60 seconds wait before throwing an error and halting; just log warning and continue if request took between 30-60 seconds
- Add static getters for
isDeepDebug,isLoadTest, andisQuickModetoTheAlgorithmm - (Demo App) Debug panel shows current state of environment variables when
NODE_ENV=development
- (Demo App) Make DMs in the timeline have a slightly different background color so they stand out
- (Demo App) Adjust
fontSizefor switch labels
- (Demo App) Put back switch label spaces; make it just "Stick To Top"
- (BREAKING CHANGE) Add
fontSizeargument toAccount.noteWithAccountInfo(), which is now a fxn not a getter - (Demo App) Add
accountBioFontSize,footerHashtagsFontSize, anderrorFontSizeproperties toconfig.theme - (Demo App) Add
config.timeline.loadTootsButtonssection to make "load toots" link labels and tooltips configurable - (Demo App) Adjust monospace font slightly
- (Demo App) Make switch box labels CamelCase (remove spaces)
- Export
DEFAULT_FONT_SIZE - (Demo App) Add
defaultFontSizeandretooterFontSizeproperties toconfig.themeand pass them to appropriate fxns
- More
tagOnlyStrings
- Update
masto.jsto 7.2.0
- Add
allowMultiSelectargument toBooleanFilter.updateOption()method - (Demo App) Add checkbox for
allowMultiSelect - (Demo App) Flip boolean and rename switches for
showFilterHighlightsandshowLinkPreviews
- More
tagOnlyStrings
- More
tagOnlyStrings
- (Demo App) Fix EISDIR error in
serve_dist_bundle.js(PR: michelcrypt4d4mus/fedialgo_demo_app_foryoufeed#6)
npm audit fixto update a few packages
- (Demo App) Don't show retoot button for DMs
- More
tagOnlyStrings
- Fix bug where toots were being kept in cache well beyond
config.toots.maxAgeInDaysvalue
- More
tagOnlyStrings
- Add
refreshTrendingData()method toTheAlgorithm - Export
sleep()helper method - (Demo App) Set default server to
mastodon.socialunless it's debug mode - (Demo App) Fix preservation of
serverstate in browser storage - (Demo App) Fix bug where trending links and toots wouldn't show up during initial load
- (Demo App) Fix error logging on
LoginPage
- Add
isGoToSocialUser()method toMastoApiandTheAlgorithm; addcanBeDisabledOnGoToSocialto API endpoint config; handle API errors differently for potentially disabled GoToSocial endpoints - (Demo App) Support maintaining registered app and user state across multiple servers
- (Demo App) Don't call
api.apps.v1.verifyCredentials()if user is on a GoToSocial instance (that endpoint doesn't exist on GoToSocial) - (Demo App) Fix bug where configured default server wasn't actually getting set as the default server
- More
tagOnlyStrings
- (Demo App) Add blurred filter to sensitive videos (maybe)
- Fix bug where user's own toots were being incorrectly removed from
getConversation()and conversation toots were being incorrectly sorted by score instead ofcreatedAt
- Handle edge case issue where muting an account causes selected filter option to disappear from list even though filter is still applied
- (Demo App) Add blurred filter to sensitive videos (maybe)
- Fix zh-TW => Taiwanese language map
- (Demo App) Remove useless show content button for NSFW images
- More
tagOnlyStrings
- (Demo App) Fix default value for
hideSensitive
- Don't count the empty string as a valid
spoilerTextfor the Type: Spoilered filter - (Demo App) Hide sensitive / NSFW images behind a clickthrough and add a toggle to enable / disable this behavior
- More
tagOnlyStrings
- (Demo App) Properly set the
websiteparam when registering a new app (should fix issues with GoToSocial logins)
- More
tagOnlyStrings
- Drop default
NUM_FAVOURITESweight to 0 now that we are pulling in toots from the home server, drop defaultDIVERSITYweight to -3
- Fix bug with
Toot.replyMentionswhen replying to users on the same server as the fedialgo user
- More
tagOnlyStrings
- Fix bug with sorting hashtag filter options by excluding all options with 0 or undefined
numToots
- Fix potential issue with sorting when only one value provided for ascending/descending arg
- (Demo App) Try to fix the
MinTootsSliderdefault value
- Put in a cache busting fallback if user's
RecentUserTootsend up empty
- Go back to manual
Tootconstruction inMastoApi.buildFromApiObjects()
- Logging of
sortByValue()results
- Set
Account.suspendedcorrectly indedupeToots() - More
tagOnlyStrings
- Add
config.scoring.diversityScorerRetootMultiplierto apply a harsher diversity penalty to retoots than to a user's own toots
- Add
config.toots.minToSkipFilterUpdatesandconfig.toots.filterUpdateBatchSizeto cut down on the number of (slow, expensive) calls toupdateFilterOptions()during loads - Fix runtime logging of
updateFilters()
- Log
updateFilters()at runtime
- More
tagOnlyStrings
- Add all followed tags to the list of existing hashtag filter options so they can be appropriately deep scanned
- Add many of the 1,000 most common english words from here to
tagOnlyStrings
- Log full list of additional tags found but in a single line
- More
tagOnlyStrings
- Be smarter about setting
UserData.lastUpdatedAtto avoid unnecessary rebuilds
- Reduce debug logging
- Add
isApiCacheKey()method; only updateStorage.lastUpdatedAtwhen API data is written
- Fix bug where
getUserData()wasn't updating to latest afterStoragedata is updated
- More
tagOnlyStrings
- Log
hasNewestApiData()
- Add
lastUpdatedAttoStorageinfo returned bygetCurrentState()
- (Demo App) Don't
resolve()Toot URLs if user is on a GoToSocial instance
- Reverse order of operations when checking that a
Tootcontains a tag as a substring
- More
tagOnlyStrings
- Refactor historical data background fetching to
MoarDataPollerclass - Don't rescore the feed after each call to
getMoarData()so as to avoid shuffling the feed as the user is looking at it - More
tagOnlyStrings
- More
tagOnlyStrings
- Rename
isTagTootsCategory() - More
tagOnlyStrings
- Change background fetch sleep to a random number of milliseconds between 0 and the configured value
- More
tagOnlyStrings
- Skip deep scan of tag filter strings when loading cached data
- More
tagOnlyStrings
- More
tagOnlyStrings
- Filters don't do deep string comparison for tags that appear in
tagOnlyStrings - Add more
tagOnlyStrings
- Even more
tagOnlyStrings
- Another workaround for
Toot.tagNames().has()
- Add a lot more
tagOnlyStringsto configuration
- Temp fix for bug with
Toot.tagNames().has()
- Call
completeObjProperties()inCountedList.incrementCount()
- Reenable broad search for all hashtags that appear only as strings, not as formal Tags
- Use existing tag regex when re-scanning filter options for any followed tag strings
- Add
tagNames()method toTootobjects that caches aSetof tag strings for faster lookup - Rename
MastodonTagtype toHashtag
- Move
CONVERSATIONandJUST_MUTINGconstants intoLoadActionenum
- Last build seemed broken... no changes just a tag here
- Fix bug where
FediverseCacheKey.FEDIVERSE_TRENDING_TOOTSdata wasn't being built into Toot objects
- Create
config.locale.messagesfor potentially user facing string configuration - Reset
trendingDatawhenreset()is called - Refactor out
FediverseCacheKeyenum
- Rename
TagTootsTypeenum toTagTootsCategory
- Only do the followed hashtag additional scan in
finishFeedUpdate(), not for each fetch because it's slow
- Update filter option counts for followed hashtags with substring search even if there's no "#" character
- Turn
TAG_ONLY_STRINGSinto aconfig.toots.tagOnlyStringsparameter; add "is" to list - Add
forEach()toCountedListclass
- Keep track of which Toots have had their foreign script hashtags suppressed from the filter options
- Refactor
SuppressedHashtagsto a singleton class - Add
config.api.errorMsgsfor error messages
- (Demo App) Disable Submit button while waiting for a new toot to be posted to the server
- (Demo App) Place cursor at end of mentions when composing a reply
- Rename
TagTootsCacheKeyenum toTagTootsType, move JSDoc for enums to its own module - (Demo App) Fix bug with disabled Submit button when composing new toots
- Fix bug in
saveTimelineToCache()
- Make a last ditch effort at
Tootlanguage detection withdetectForeignScriptLanguage()
- Refactor API errors handling methods to
api/errors.tsfile - Add
logStringifiedProps()toLoggerclass
@types/blueimp-md5is a dev dependency, not an actual dependency- Upgrade
axiospackage to 1.10.0
@react-native-async-storage/async-storageis a dev dependency, not an actual dependency
- Add
isTagTootsCacheKey(),isCacheKey()methods, use to reduce logging ofTagTootsCacheKeyfetches
- Fix bug with checking whether API objects can be uniquified
- Remove the actual
Scorerobject fromTheAlgorithm.weightsInfovalue properties
- Merge
TagList'sremoveMutedTags()intoremoveInvalidTrendingTags()
- Use a real mutex to lock
TheAlgorithm's toot fetch methods; rework logging situation - Cache user's Mastodon server instance info in browser storage for 30 days
- Add
isRetooterproperty toUserData - Fix issue where
isRetooterwas incorrectly applied toFAVOURITED_TAG_TOOTS - Rename
ObjWithCountListtoCountedListand stop exporting it
- Rename
FeatureScorertoTootScorer - Rename
HOMESERVER_TIMELINE_TOOTSto justHOMESERVER_TOOTS - Remove
moreOldTootsargument fromtriggerFeedUpate()(client app should calltriggerHomeTimelineBackFill()) - Remove config
hashtagTootRetrievalDelaySeconds; don't sleep before launching hashtagTootretrieval - Use
fetchGenerator() for all API calls instead of eitherfetch()orfetchGenerator()` - Lower
config.api.backgroundLoadSleepBetweenRequestsMSto 1000
- Mark
Tootobjects that are missing atrendingLinksproperty as needing to be recompleted
- Use appropriate conditional types in
MastoApi, renameMastodonApiObjtoApiObj - Standardize the uniquification step across all the various types of
ApiObjs
- Uniquify accounts on
webfingerURI - (Demo App) Fix handling of missing
toot.trendingLinks
- Remove empty strings when generating
wordsRegex()
- Fix
UserData.mutedKeywordsRegexwhen the user has no server side filters
- Add
lastEditedAtgetter toTootand compare it tocompletedAtwhen evaluatingTootcompleteness so as to catch edits - Bust
Toot'scontentCacheat build time if Toot'seditedAtproperty exists - Sort
Toots most recent first when de-duping properties
- Fix bug when
DiversityFeedScorertries to buildscoringDatabeforetoot.trendingTagsis populated
- Add
MastoApi.getHomeserverTimelineToots()and integrate local server toots into timeline
- (Demo App) Fix
logout()call
- Fix potential bug when truncating cached rows
- Make ESLint happier
- Add ability to filter by originating server
- Don't sort
Tootobjects twice inbuildToots()
- Bump
brace-expansionwithnpm audit fix
- Add
isLocalgetters toAccountandTootobjects, improveextractDomain()helper method - Add
isLocalUrl()method to MastoApi - Don't rebuild
Accountobjects unnecessarily - Uniquify
Accountobjects byurl, not byid(IDs are only unique across a single server)
- Export
optionalSuffix()helper - JSDoc comments for
string_helpers.tsandLogger
- Remove default for
getRechartsStatsData(numPercentiles) - Rename
TootFilter.titletopropertyName - (Demo App) Add
config.status.numPercentilesparameter
- Add support for blocked domains
- Precompile a
mutedKeywordsRegexand store it in theUserDataobject - Add
Toot.matchesRegex()method - Add
fedibird.comto list ofnoMauServers
- Fix error handling in
MastoApi.getServerSideFilters()
- Fix filtering of user's own toots out of their timeline
- Return more
MastoApiproperties ingetCurrentState()
- Add
allEmojis()getter toToot - (Demo App) Larger font for version information
- Make
TheAlgorithm.weightedScorersprivate - Make
isFollowedandisFolloweractually optional onAccount
- Rename
AccountandTootobjects'homeserverURLtolocalServerUrl - Add
accountUrl()method toMastoApi
- Allow
TRENDINGweight of 0
- Add input validation for
updateUserWeights() - Get rid of
skipSortparam; introduceTootSourcetype
- Set
FEDIVERSE_POPULAR_SERVERSstaleness to 5 days
- Use
Promise.allSettled()to ensure we wait for all loads to complete before marking state as not loading any more - Move
minCharsForLanguageDetectandmaxContentPreviewCharstoTootsConfig
(Demo App) Go back to logging out after NetworkErrors
- Stop requiring all
FetchParamsto have a value - Make
TheAlgorithm.weightPresetsinto a static variable
- Convert
isBoolean/NumericFilterNamemethods to staticTootFilter.isValidFilterProperty()
- JSDoc comments for
Account
- Convert
TheAlgorithm.getTimeline()to a getter namedtimeline,getApiErrorMsgs()toapiErrorMsgs,isLoading()andserverInfo()to getters - Convert
Tootobject'sattachmentType,author(),contentTagParagraph(),isDM(),isFollowed(),isPrivate(),realToot(),realURI(),realURL()to getters - Convert
Accountobject'shomeserver(),homeserverURL(),noteWithAccountInfo()to getters - Convert
Toot.getScore()toscoregetter - Rename
ObjWithTootCounttoNamedTootCount,WithCountstoTootCounts - Upgrade
masto.jsto 7.1.0 - Fix handling of failed hashtag timeline and search for hashtag API requests
- Add "la" to
TAG_ONLY_STRINGS
- Set
FEDIVERSE_POPULAR_SERVERSstaleness to 72 hours - (Demo App) Reverse the order of color highlighting for tag filters so trending tags are always colored first
- Lower
timeoutMSto 2,500
- Don't log
FollowersScorerdata
- Lower log level for missing score message
- Add
FollowersScorerto weight accounts that follow the fedialgo user - Cap initial followed account retrieval before merging toots to timeline at 1,600; beyond that they will be loaded in a background job that sleeps
config.apibackgroundLoadSleepBetweenRequestsMSin between requests - Fix
OUTLIER_DAMPENERvalue in various presets - Fix removing newly muted accounts from feed
- (Demo App) Sort filter options by
displayNameif available
- Update the cache in the background instead of always dropping/reloading the whole thing when it gets stale
- Add
getFollowers()toMastoApi; add configuration variableconfig.api.pullFollowersto turn on/off follower retrieval - Don't wait for scorers to finish preparing before integrating toots into the timeline
- Remove
TheAlgorithm.filterOptionDataSources()method TheAlgorithm.userDatanow refers to the same object asMastoApi.instance.userData
- (Demo App) Add switches in the hashtag filter section to enable / disable each kind of hashtag colored highlighting (participated/favourited/trending)
- (Demo App) Fix column spacing in trending tags section
- Fix source in
TagList.fromParticipated()
- Apply the
TRENDINGmultiplier even to followed toots
- Don't strip out followed hashtags from the trending tag list if they aren't being used to fetch toots for those tag
- Much cleaner, decorator based approach to building options for
BooleanFilterOptionList - (Demo App) Show loading spinner immediately upon clicking "clear all data"
- Set time decay to 0 for
TOTAL_CHAOSweight preset
- Add an
AuthorFollowerScorer - Fix bug where
DiversityFeedScorerwas penalizing new toots with trending tags more than old toots with trending tags - Flip default sign on scores returned by penalty scorers: they now just return positive values like other scorers, but the default weights sign is flipped to negative
- Add a
TOTAL_CHAOSweight preset - Rename
Tootobject'srealAccount()toauthor() - Add a
withRetoot()method toToot
- (Demo App) Don't show
OAUTH_ERROR_MSGon network errors
- Let
class-transformerdeserialize arrays directly - Add cache summary to
getCurrentState()'s storage info
- Add
triggerMoarData()method toTheAlgorithm - Don't trigger unnecessarsy
maxCacheRecordstruncation calls - Explicitly mark
loadStartedAtinstead of relying on message passing tosetLoadingState() - (Demo App) Add button/link to trigger pulling the next batch of historical user data to tune the algorithm
- (Demo App) Use last load times computed within React instead of those provided by
TheAlgorithm
- (Demo App) Followed hashtags use same color scheme as followed users
BooleanFilterOptionList.maxNumTootsis now a variable not a function- Add
isFollowedto hashtagBooleanFilterOptions - Add
maxValue(property)toBooleanFilterOptionList - Fix User filter
isFollowedfor accounts w/interactions
- (Demo App) Bump
webpack-dev-serverto version 5.22 vianpm audit force
- Refactor/clean up language and hashtag filter option building
- Add
maxCacheRecordsoption to API endpoints config - Refactor decoration of filter options into various
BooleanFilterOptionListsubclasses
- Call
setFeedInApp()with empty list as soon asreset()is called
- Fix edge case with error handling during
MastoApi.reset()whereWaitTimeobject is missing - Use
Promise.allSettled()to rescue partial results from API calls - Handle API errors better when getting trending/participated/etc. tag toots
- Add
getApiErrorMsgs()method toTheAlgorithm(and add those messages to thegetCurrentState()return value) - (Demo App) Remove muted/blocked accounts from thread view, pass a source param to
completeProperties()instead of booleanisDeepInspect - (Demo App) Display non-fatal errors below control panel when they happen
- Avoid overzealous language determination for user's own toots
- At startup, if timeline cache is full truncate it down to
config.toots.truncateFullTimelineToLengthrecords - Add bsd.network to
noMauServerslist - Add "mastodon" to the list of tags that can only match as tag names
- Add a
displayNameproperty toBooleanFilterOption(and populate it for languages and accounts) - Add sum of reply/favourite/retoot counts to user filter options'
numToots - Add usage counts to language filter options'
numToots - Use type
BooleanFilterOptionListforUserData.favouriteAccounts - Increase staleness for followed accounts and tags to 12 hours
- (Demo App) Don't make unnecessary calls to
updateFilters()when sorting UI's filter options by count etc. - (Demo App) Disable Highlights Only switch if Hide Filters is turned on
- On API error, check whether merge is supported before checking whether cache should be discarded in favor of new rows
- (Demo App) Persist the state of each filter section's header checkboxes between sessions
- Strip useless params out of
validateParams()logging of API params - (Demo App) Add a "Hide Filter Highlights" checkbox to the main Feed page
- (Demo App) Preserve the user's checkbox selection states between sessions
- (Demo App) Remove
react-persistent-statepackage
- (Demo App) Fix build
- (Demo App) Standardize app configuration
- Rename
BooleanFilter'supdateValidOptions()toupdateOption() - Completely reset scorers when
reset()is called - Suppress foreign language and muted keyword trending tags completely
- Rename
BooleanFilter.validValues()toselectedOptions - Add a
maxSecondsPerPageto the API config that will halt polling if things are going slow - (Demo App) Fix bug with formatting of type filters leading to errors when selecting multi word options
- (Demo App) minToots slider value should update as more data comes in
- Rename
BooleanFilter.isThisSelectionEnabled()toisOptionEnabled()
- Rename
BooleanFilter'soptionInfoproperty to justoptions - Drop configured
initialMaxRecordsfor favourited toots to half of the other configuration because it seems to be the bottleneck
- (Demo App) Add a 'Create New Toot' button to the main page
- Export
DATA_SOURCES_FOR_FILTER_OPTIONS, addfilterOptionDataSources()method toTheAlgorithm
BooleanFilterOptionnow contain more information than just the number of toots in the current timeline they match (in particular they now contain enough information to drive the color gradients)- (Demo App) Lower configured
idealNumOptionsfor theMinTootsSliderto 60
- Add
UserData.favouriteAccountsproperty - Repair broken audio attachments like we do with images and videos
- Refactor an abstract
ObjWithCountListclass fromTagListclass so we can hold account info - (Demo App) Reorder filter section (and make it easily configurable in the future)
- (Demo App) Fix bug with computing gradients at new user login
- Add
map()method toTagList - Add a section for "Hashtags You Often Favourite"
- Stop exporting
isDebugMode(it's a static property now) - Add
FEDIALGO_DEEP_DEBUGenv var and correspondingLogger.deep()method UserData'sTagproperties are nowTagListobjects;TagListhas a few new methods to make it easier to work with
- Add
config.favouritedTags.maxParticipationsparam - (Demo App) Fix bug where reply mentions were injected twice
- Fully separate
TagTootsCacheKeyenum elements fromCacheKeyenum
- Add
favouritedTagsproperty toUserDataobject - Export
TagTootsCacheKeytype - (Demo App) Add cyan color gradient for user's favourited hashtags in the hashtag filter view
- (Demo App) Link the Github Release Notes instead of the raw CHANGELOG.md in the header
- New
BooleanFiltermethodoptionsAsTagList() - Lower staleness duration for server side filters to four hours
- Don't alias
LoggertoComponentLoggerwhen exporting - (Demo App) Use new
MinTootsSlidercomponent to control the number of trending objects in the list
- Use
Loggers instead oflogPrefixargs everywhere
- Refactor main
MastoApimethod method into a few easier to follow pieces - Fix bug where scorers were not resetting their state when
reset()was called and all other data was reset - Uniquify
Notificationobjects from the API against the cache as they arrive to avoid the build up of dupes MastoApi.instanceInfo()only returns the v2 API data structure for a server configuration. If the v1 version exists it will be logged and thrown as an error.- Adjust
DISCUSSIONSweight preset
- Stop exporting
sortKeysByValue()helper - Use
import { type Thing }instead of justimport { Thing}where appropriate bc apparently it makes the typescript compiler happy - Add missing
enums.tsfiles - (Demo App) Better error handling/formatting, esp. in
ReplyModal - (Demo App) Fix small bug with bootstrapping the minTootsSlider
- Add
entriesSortedByValue(),optionsSortedByValue(),optionsSortedByName(), andnumOptions()methods toBooleanFilter - Export
TagListclass - (Demo App) Make the minTootsSlider's initial value flexible to try to show the newly configured
idealNumOptions
- Rename
TRENDING_HASHTAGStoTRENDING_TAGSandPARTICIPATED_HASHTAGStoPARTICIPATED_TAGS - (Demo App) Rework / generalize color gradient config for participated hashtags
- (Demo App) Undo some memoization in
Feed.tsxafter the scroll listenershowMoreToots()somehow went crazy and loaded the entire timeline (diff: https://github.com/michelcrypt4d4mus/fedialgo_demo_app_foryoufeed/compare/baf2640872fb521b0b739d2e213d618cf2305317..master)
- (Demo App) Fix bug with color gradient for hashtags (was checking the wrong boolean), Revert to the original
getTooltip()for now
- Logging cleanup
- (Demo App) Fix memoization watcher for type filter
- (Demo App) Use
ComponentLoggerfrom fedialgo package
- (Demo App) Fix bug where long filter labels weren't getting trimmed to configured length
- Add information about storage usage for each primitive type to
getCurrentState() MastoApinow has areset()method which is called byTheAlgorithmduring resets- Add telemetry to
MastoApifor request wait times (data is returned ingetCurrentState()under the newApisection) QUICK_MODEisn't always turned on whenNODE_ENV=developmentand/theFEDIALGO_DEBUGenv var is turned on; has to be enabled separately now- Add
BooleanFilter.isThisSelectionEnabled()method - (maybe)
fixed bug whereBooleanFilterwasn't being fully reconstructed as class instances (they were just objects and so had no instance methods) - Export
ComponentLoggerclass
- Add a
TootCacheobject property to eachTootthat memoizes the results of frequently called string functions likecontentWithCard()orcontentWithEmojis()
- Exclude object's functions when computing browser storage usage (the fxns aren't serialized to storage?)
- (Demo App) Sort fediverse server list by
followedPctOfMAU - (Demo App) Trending panel configuration options in main config
- Export
TrendingTypeenum
- Add
serversto renamedTrendingDatatype; removeTheAlgorithm.mastodonServersproperty; exportTrendingDataandMastodonInstancetypes; removeMastodonInstanceEmptytype - Add Thai, Hindi, Hebrew language detection for hashtags
- (Demo App) Toggling of how many trending links/tags/etc. are shown
- (Demo App) Add tooltips to all the filter header switches; add
HeaderSwitchcomponent - (Demo App) Consolidate configurable stuff
Configobject
- Export
LANGUAGE_CODESdict - (Demo App) Show full language name in filter section, not just 2 character code
- Add filters to
getCurrentState()return value - Remove diacritics from text when filtering for hashtag matches. Fixes bug where german/french etc. tags weren't filtering correctly bc tag names have already had diacritics stripped
- Change hashtag language detection regexes to match substrings instead of whole strings
- Fix bug where japanese/arabic/etc. tags reappear when trending tags are loaded from the cache at startup
- Add
lodashlibrary, use it formakeChunks()which is exported as a helper method - (Demo App) Reorder filters so interactions filter is at the top. Filters switches now have column based sorting instead of row based sorting.
- (Demo App) Memoization optimizations for
StatusComponentprops,TrendingInfosections (the most expensive renders according to profiler) - (Demo App) Standardize logging through
ComponentLoggerclass
- Add
replyMentions()method to Toot objects - Collate all
trendingLinkson aToot, don't settle for first found - Add
numTimesShownto standardPROPS_THAT_CHANGEcalculation - (Demo App) Inject Toot.replyMentions() account tags into top of replies; disable submit reply button until toot's ID is resolved
- Fix bug with moar data poller favourited toots puller that caused it to think it was finished after pulling only the minimum number of favourited toots
- Actually fix the 'realURI is not a function' by making sure all
TootrelatedCacheKeys are inSTORAGE_KEYS_WITH_TOOTS
- Temporary workaround for 'realURI is not a function' errors
- Stop considering retoots of toots w/hashtags to be "participation" in those hashtags unless the user is mostly a retooter meaning more than
config.participatedToots.minPctToCountRetootsof their toots are retoots
- (Demo App) Adjust the color gradients so there's more color variation in the low/middle range in the hashtag filters
- (Demo App) Remove unused
node-emojipackage
- (Demo App) Bump up
tsconfig.json'sjsxtoreact-jsx
- Use a workaround for the weird issue with half width japanese characters when determining a hashtag's language
- (Demo App) Bump up
tsconfig.json'stargettoES2016
- Remove japanese/korean/cyrillic etc. tags from trending list unless that's the user's current language
- Add
invalidTagsproperty toTagTootsConfigtype - Bump up filtering out of participated tags from favourited tag toots pull to "more than 3 uses"
- Lower
config.batchCompleteSleepBetweenMSfrom 250ms to 150ms because thecompleteProperties()seems to be much faster now
- Introduce
TagListandTootsForTagsListclasses to manage participated/favourited/trending tags
- Don't remove user's own toots from the threaded view
- Add
getFavouritedTagToots()to get non followed / non participated tags based on favourites into the mix
- (Demo App) Avoid invalid file extensions in the MIME -> extension mapping
- (Demo App) Use
useDropZone()instead ofDropzonefor attachment uploads
- (Demo App) Limit media attachments to the sizes and MIME types specified in the user's home server's configuration
- (Demo App) Fix bug with
serverInfoinstantiation
- (Demo App) Fix bug with image previews in replies
- Add
serverInfo()toTheAlgorithm; addserverInfo()response togetCurrentState() - Add
homeInstanceInfo()method toAccount - (Demo App) Validate replies adhere to the
maxCharactersandmaxMediaAttachmentsconfigured for the user's server
- (Demo App) Disable background
resolve()resolution of toots on scroll
- Fix bug in wordRegex() method (AI sucks)
- Return Trending data in
getCurrentState() - Refactor
UserDatapopulation, addregexproperty to trending links and tags - Precompile hashtag and trending link search regexes
- (Demo App) Refactor
AttachmentsModalintoMultimediaNodecomponent, only register an arrow key listener when there's more than one image
- (Demo App) Stick the left panel to top but allow scrolling within it if it's more than the viewport height
- (Demo App) Fix bug where new tab opened when trying to open the raw
TootJSON modal
- (Demo App) Add ability to reply to toots inside the app
- (Demo App) Pre-emptively resolve the toot ID as it appears on screen to speed up future interactions
- (Demo App) Add experimental feature to completely wipe the app so as to deal with OAuth errors
- Add
completeflag argument toreset()method
- (Demo App) Show original toot in raw JSON view, not just the realToot
- Add
Toot.resolveID()method andresolvedIDproperty, removeToot.resolvedproperty because of recursion issues
- (Demo App) Allow thread viewer on reply toots w/out their own replies
- Don't set
resolvedToottothisif there's a failed lookup because it leads to a recursion error inclass-transformer
- Resolve toot before
getConversation()
- (Demo App) Thread viewer accordion panel
- Add
getConversation()method toTootclass - Log suspended accounts
- Remove blocked/muted keywords from the visible list of trending tags
- Fix bug where home timeline toots were being sorted backwards before being truncated
- Refactor
Toot.contentWithCard()method
- Suppress warnings when
ChaosScorercallsgetIndividualScore()
- (Demo App)
useMemo()for a few possibly expensive calculations
- Make numeric filters apply to the
realToot()not the retoot, don't usescoreInfoto get values for numeric filters
- Convert various
Array.includes()calls intoSet.has()calls (more than 20x faster according to jsbench.me results)
- Move score statistics stuff out of
Scorerclass and intostats_helper.ts
- Change format of
TootScoreobject, removealternateScoreInfo()andformatScore()methods (functionality moved to demo app) - Rename some config options
- (no changes, just a test build)
- Add a
FollowedAccountsScorerto offset the slowly creeping dominance of participated and followed tags in the feed
- Add
#governmentto the list of "too generic to trend" tags - (Demo App) Mobile improvements from @nanos
- (Demo App) Code improvements
- (Demo App)
ErrorBoundarycomponent to catch any and all errors
- (Demo App) Drop down buttons now display the selected option
- (Demo App) Fix
LoginPageredirect (had two frontslashes)
- Clear
TheAlgorithm.cacheUpdaterinreset() - Rename
Configtoconfig; convertconfig.api.staleDataTrendingMinutesto method; lowerhashtagTootRetrievalDelaySecondsto 1 second - Rename
config.api.backgroundLoadIntervalSecondstobackgroundLoadIntervalMinutes - Refactor
stats_helper.tsfor Recharts data stuff
- Make
Configaclassinstead of just an object - Add missing files from last build
- Move scorer descriptions out of
configand into theScorerclass - Bump up default diversity penalty weight to 2.0
- Separate
StorageKeyenum intoCacheKeyfor API methods andAlgorithmStorageKeyfor other FediAlgo browser storage
- (Demo App) Remove await from
WeightSlidercall toupdateUserWeights()
- (Demo App) Fix build
- Compute the average final score per decile of raw/weighted score
- (Demo App) Add link in header to
CHANGELOGand a link for bug reports
- Export
MinMaxAvgandScoreStatstypes - (Demo App) Add option to chart raw vs. weighted score stats, avg vs. min vs. max per quartile/decile/etc
- (Demo App) Fix bug in charting of score stats
- Add
TheAlgorithm.getRechartsStatsData()method to prepare data about score statistics forRechartspresentation - (Demo App) Add show stats button to experimental section
- Separate out
NonScoreWeightNameandScoreNameenums fromWeightNameenum - Add quintile stats for the feed for each score category to the
getCurrentState()return object
- Set up a poller to periodically save changes to toots'
numTimesShownproperty to the cache
- Refactor
Configvariables into namespaces - (Demo App) Fix bug with hashtag color gradient at startup
- Truncate the stored home timeline toots array to the same max length as the overall timeline so it doesn't grow forever
- Add
AlreadyShownScorerandToot.numTimesShownproperty (managed by the client app) - Drop
WeightName.PARTICIPATED_TAGSdefault weight to 0.15
- Fix boolean logic for multiple type filters
- (Demo App) Use a color gradient for participated hashtag filter coloring
- (Demo app) Fix alt text on images
- Improve hashtag paragraph detector regex
- (Demo App) Tweak CSS for tag paragraph
- Add
contentParagraphs(),contentNonTagsParagraphs(), andcontentTagsParagraph()methods toTootobject - Remove emoji short codes from strings used for language detection
- (Demo App) Display
contentTagsParagraph()in smaller font and below images/polls/etc (if it exists)
tootFetcher.nameyields empty string in production so use a logPrefix argument- (Demo App) Allow multiple filter accordion sections to stay open at the same time
- Standardize upgrade repair of all user's filter settings
- Generalize upgrading stored boolean filter settings
- Handle upgrading stored filter settings (remove deprecated server side filters)
- Adjust the
TRENDINGpreset to more heavily weight number of replies and retoots,DISCUSSIONSpreset to more heavily weightPARTICIPATED_TAGSandINTERACTIONS, and bump up a lot ofFRIENDSpreset related weights - Lower
Config.tootsCompleteAfterMinutesto 24 hours
- Add min/max score to
TheAlgorithm.statusDict() - (Demo App) Add icon for bot account toots
- Remove
TheAlgorithm.logCurrentState()method - Drop
Config.toots.maxCachedTimelineTootsto 3,000
- (Demo App) Fix bug with action button count comparison
- Add filter for
TypeFilterName.BOT - Export
isValueInStringEnum()helper,KeysOfValueTypetype - (Demo App) Enable unfollowing accounts
- Rename
ScorerDicttype toWeightInfoDict - Remove
BooleanFilterName.SERVER_SIDE_FILTERS(toots that match server side filters are now stripped out as invalid inbuildToots())
- Sort trending toots by
trendingRank - (Demo App) Render the trending toots using the
StatusComponent
- Add
mastodon.gamedev.placeto the list ofnoMauServers - Remove invalid toots in
Toot.buildToots() - Refactor
Toot.uniqFlatMap()method
- (Demo App) Add missing
Confirmation.tsxfile
- Filter out toots matching the server side filters altogether (in particular from the list of trending toots)
- Use
split()method to separateToots needing completion from those that are complete
- Re-optimize
Tootcompletion
- Speed up re-filtering of the feed during
refreshMutedAccounts() - Export
WeightPresetLabelenum
- (Demo App) Fix account tooltip when control panel isn't sticking to top by moving it into the feed
<div>
- (Demo App) Add mute and follow account buttons
- Add
refreshMutedAccounts()method toTheAlgorithm
- (Demo App) link to repo in header
- (Demo App) Error handling around initial app registrations
- (Demo App) minimally validate server URLs on LoginPage
- Add
getFavouritedToots()tomoar_data_pollercall
- Add
Config.tootsCompleteAfterMinutesto set an upper bound on how old toots can be before we assume there will be no new info about trending tags/links/etc to re-evaluate for them
- (Demo App) Extract the
REPO_NAMEandREPO_URLfrompackage.json
- Add
ConfigtogetCurrentState()response
- Decrease production logging
- Add a "spoilered" filter for toots with
spoiler_text - Add a "private" filter for non public, followers only toots
- Turn on minor
Toot.dedupeToots()optimization - Fix collation of
favourited,reblogged, andbookmarkedflags indedupeToots(), add collation offilteredproperty - Optimize type filter matching
- Make
TheAlgorithm.isDebugModea static variable set at run time
- More futzing with type exports
- Export types with
export type
- Fix toot type filtering for retooted audio/image/video attachments and sensitive toots
Remove unnecessary exports ofTrendingLink,TagWithUsageCounts,FeedFilterSettings,Weightstypes
- Remove HTML tags from
Toot.contentfield when scanning for hashtags and keywords withcontainsString()
Stop exporting unnecessaryBooleanFilterandNumericFiltertypeDropTrendingTagsweight to 0.2
- Filter out zero weighted scores from
Toot.alternateScoreInfo()
Stop exporting unnecessaryWeightNametype
- Rename
PresetWeightsconstant toWEIGHT_PRESETS, stop exportingPresetWeightLabel, addTheAlgorithm.weightPresetsproperty
- Ensure
triggerPullAllUserData()setsloadingStatusto null if there's an exception
- (BREAKING CHANGE) Export
TheAlgorithmas the default export fromfedialgopackage instead of a named export - Add
displayNameFullHTML()toAccountobject - Fix bug with upgrading stored filter args
- (Demo App) Add icon link to show the raw Toot JSON in a modal
- Add
getCurrentState()method toTheAlgorithm
- Change
Toot.alternateScoreInfo()format - Rename
TheAlgorithm.logWithState()tologCurrentState()
- (BREAKING CHANGE) Rename
PropertyFiltertoBooleanFilter,PropertyNametoBooleanFilterName,FeedFilterSettings.filterSectionstoFeedFilterSettings.booleanFilters
- Remove diacritics from tag names
- Incremental load of stale data when possible instead of complete refresh; move staleness config to
Config.apiDefaults - (Demo App) Move the error modal up to
<App>level; propagate setError
- (Demo App) mobile support
- (Demo App) user data view params
- Fix bug where followed tags weren't being lowercased before ending up in
UserDataif they were loaded from the cache
- Add a new
FavouritedTagsScorer(and a newUserData.favouritedTagCountsproperty) - Add
TheAlgorithm.pullAllUserData()method to enable full backfill of user data - Add "Experimental Features" section to the demo app
- Fix bug where new scorer weights were not automatically getting set to defaults
- Remove trending tags from the list of participated tags we're pulling toots for because we get them anyways
- Fix bug where home timeline toot cache would just grow (dedupe on the way in)
- Add
API_DEFAULTSconfiguration - Rename
ScoreInfotype toWeightInfo, renameTheAlgorithm.scorersDicttoweightInfo - Fix bug in
sortObjsByProps()when called with multiple sort params
- Use a value for the user displayed TIME_DECAY param that is 10x the value used in the calculation to make it more user friendly.
- Increase cached toots default config to 3,500
HomeTimelineParamsinterface and helper inTheAlgorithm
- More language detection cleanup
- Fix language fall through logic, clean up code
- Consolidate language detection stuff in
language_helper.ts
- Language detection for toots that need it
- Add toot.io to no trending link servers
- (Demo App) Hide link previews checkbox
- Set name and storeName of localForage browser storage (used by Storage)
- Rename
TypeFilterName.REPOSTStoRETOOTS - Add
ageInHours()helper; allow age related fxns to take second arg; addhomeFeedTimespanHourstostatusDict()
- Keep
Toot.reblogsBysorted bydisplayName
- Return existing score instead of 0 if
Scorerisn't ready yet (if it exists)
- Sort built toots by their preliminary score, not by their popularity
- Increase default
FOLLOWED_TAGSweight to 4 - Decrease default
TRENDINGweight to 0.15 - Add
Toot.getScore()method - Add
Config.batchCompleteTootsSizeparam, renameConfig.batchCompleteTootsSleepBetweenMS
- Separate out the backfill functionality to
TheAlgorithm.triggerHomeTimelineBackFill() - Improve
Storage.dumpData()method; remove unusedStorageKeys
- Add
moreOldTootsparameter totriggerFeedUpdate() - Fix bug where
getParticipatedHashtag()toots wasn't returning a promise - Up
Config.toots.maxCachedTimelineTootsto 2,500 - Remove unused
Config.reloadFeaturesEveryNthOpenparam
- Set
sideEffects: falseinpackage.jsonso webpack can tree shake (again)
- (Demo App) fix icons
- Change
DEBUGenv var toFEDIALGO_DEBUG, exportisDebugMode
- Increase default
TIME_DECAYfrom 0.05 to 0.15 - Change constructor argument from
languagetolocale - Add
Account.noteWithAccountInfo()method
- Increase
Config.numParticipatedTagTootsPerTagto 10 TheAlgorithm.tagUrl()method
QUICK_MODEenv var limits initial data pull same asDEBUGenv var- Fix bug where
TheAlgorithm.mastodonServerswere not loaded from cache - Lower
Config.OUTLIER_DAMPENERto 1.6
- Remove
sideEffects: falsefrom both fedialgo and demo apppackage.jsonand put back<link>tag inindex.htmlbecause a lot of CSS disappeared
- Rename
TrendingTagtype toTagWithUsageCounts
- Set
sideEffects: falseinpackage.jsonso webpack can tree shake
- Add a way to do a second pass to get the HASHTAG counts right with
updateHashtagCounts()(but don't actually use it) - Increase
Config.maxConcurrentRequestsBackgroundto 8 - More default servers
- Generate a new Array when updating filter valid values so as to trigger a
useMemo()recomputation in demo app - Shuffle the
Config.defaultServerswhen adding additional servers to mix it up - Configure
TAG_ONLY_STRINGSto avoid usingcontainsString()to scan for tags like "us" and "it" loadingStatusno longer assumes "Loading" will be prepended
- Suppress a bunch of language hashtags (japanese, russian, greek, korean, arabic) if they don't match the configured language
- Export
sortKeysByValue()
ChaosScorer._score()returns the existing raw score before computing a new one- Filter out Japanese hashtags unless
Config.locale.languageis "ja"
- Special
mediaAttachmentrepair for bluesky bridged toots - Add
TypeFilterforIMAGES,VIDEO, andAUDIO - Add
numTriggerscounter
- Set
isFollowedingetFollowedAccounts(), alwaysAccount.build()startsisFollowedas false - Fixes to
Toot.dedupeToots(), which was kind of broken because of uniquifying on retootrealURI()and randomly choosing retoots or real toots in final step - Only penalize the "trending" parts of followed accounts & tags toots (last change was no penalty at all)
- Lowercase
Account.buildWebfingerURI() - Bump up
minRecordsForFeatureScoringto 480 - Load
Algorithm.homeFeedfrom cache on startup
- Call
Toot.complete()in batches of 50 instead of 100, increase sleep time to 250ms from 200 - Don't penalize toots from followed accounts and tags with
TRENDINGmodifier if it's less than 1 (and thus a penalty) - Apply the
OUTLIER_DAMPENERto theDiversityFeedScorerpenalty - Move the
isFollowedproperty toAccountinstead ofToot - Add
Toot.isFollowed()method - Tweak
Toot.containsTagsMsg()string
- (Demo App) Implement viewing and voting in Mastodon polls
timeString()helper now puts "this coming" prefix for future days
- Export
isAccessTokenRevokedError()
- Deal with bug where Toot's followedTags property was getting lost
- Add
TheAlgorithm.mostRecentHomeTootAgeInSeconds()method - (Demo App) Revamp
useAlgorithmContext
- (Demo App) Tooltip text for auto load checkbox
- Add
TheAlgorithm.isDebugproperty
FollowedAccountsandRecentNotificationsare pulled in batches of 80 records instead of 40;FollowedTagspulled in batches of 100fetchHomeFeed()hasskipMutex=true- Bump up
TRENDINGweight to 0.25
- Add
Config.lookbackForUpdatesMinutesparam and scan backwards from themaxUpdatedAtthat many more minutes to catch changes - Add a check for
LOAD_TEST=trueenv var that dramatically bumps up the number of toots to retrieve - Rename
Config.toots.maxAgeInDays(was hours increment), add age check toToot.isValidForFeed()
- Add
Config.isAppFilterVisibleboolean - Add
Toot.completedAtandshouldComplete(), renameToot.setDependentProperties()tocompleteProperties() - Add
Config.sleepBetweenCompletionMSto avoid overloading browser withcompleteToots()
- Defer processing of the most expensive
Tootproperties (trendingLinks, mostly, but other tag stuff too) until all data has arrived fetchHomeFeed()now infers themaxTootedAtparam from the cachedHOME_TIMELINEtoots- New private property
TheAlgorithm.homeFeed: Toot[] - Rename
Config.api.backgroundLoadIntervalSeconds - Add
validateConfig()
UserData.followedTagsis now aTagNamesdict
Toot.containsString()also checks the link preview card text- Add a
Toot.participatedHashtagsproperty and corresponding filter - Rename
HASHTAG_PARTICIPATIONtoPARTICIPATED_TAGS; add participated hashtags toToot.containsTagMsg()
- Export a
NON_SCORE_WEIGHTSarray forTIME_DECAYetc.
- (Demo App) Add missing
Showcase.jpgfile to repo
- Massively rework how loading of home timeline toots is accomplished
- Add a language argument to Algorithm.create() and choose servers for trending toots based on it
- Refactor
lockExecution()
- Add a Sensitive (NSFW)
TYPE_FILTER - Add
OutlierDampenerweighting option
- Add
Config.numParticipatedTagTootsPerTagoption and set it to 5 so we pull far less participated tag toots - Add UserData.languagesPosted in and UserData.preferredLanguage
- Don't set
catchupCheckpointif the feed is empty - Fix bug where
Account.webfingerURIfield was not getting set
- Lower
Config.incrementalLoadDelayMSto 500 ms - (Demo App) Fix bug with missing
mostRecentAt
- Use
class-transformerpackage to serialize and deserialize objects (which will hopefully improve speed)
- Fix bug where changes to the feed would invalidate old FeedFilterSettings in the GUI
- Add
Config.invalidTrendingTagsparam to list tags that are too generic to be used TheAlgorithm.reset()also resets concurrency
- Add a
sourceproperty toTootclass - (Demo App) Reduce the
numDisplayedTootsif user scrolls up enough
DiversityFeedScoreralso penalizes trending tags that show up more thanConfig.minTrendingTagTootsForPenaltytimes- Rename
Config.homeTimelineBatchSize - Automatically serialize or deserialize toots to/from
Storage.get/setbased on values inSTORAGE_KEYS_WITH_TOOTS - Configure
STORAGE_KEYS_WITH_ACCOUNTS,STORAGE_KEYS_WITH_UNIQUE_IDS, call unique checker in debug mode loading fromStorage
- Expose
TheAlgorithm.isLoading()method triggerFeedUpdate()is no longer called recursively
- [BREAKING CHANGE] Rename
TheAlgorithm.getFeed()totriggerFeedUpdate(). No longer returns anything. - [BREAKING CHANGE] Rename
setFeedInAppparam tosetTimelineInApp - Simplify the alternate score dict
- Disallow setting the catchup checkpoint before the overall app timeline cutoff
- UserData object now just stores a lookup dict for
followedAccountsinstead of all the actual followedAccountobjects - Refactor generic
Account.buildWebfingerUriLookup()method - Refactor
TheAlgorithm.setCheckpointAndLoadingStatus()method - Add delay of
Config.api.hashtagTootRetrievalDelaySecondsto the initial loading of the trending and participated hashtag toots - Rename
setLoadingStateVariables()andsetLoadCompleteStateVariables()
MastoApi.instance.setBackgroundConcurrency(),Config.maxConcurrentRequestsBackgroundoption. Handle missingStorage.getIdentity()if possibl- Ignore retoots when computting users hashtag history
- Remove blocked keywords (no bueno) and followed tags (they show up on their own) from the list of tags to scan for new toots
- Re-raise access token revoked errors in
mergePromisedTootsIntoFeed()
- Double
Config.numParticipatedTagsToFetchTootsForto 20 - Make type filters apply properly to retoots
- Get rid of useless UserDataSerialized type
- Rename
Toot.simplifiedScoreInfo()toalternateScoreInfo() - Remove deprecated
Config.enableIncrementalLoadproperty - Privatize a bunch of
TheAlgorithmproperties that should be private
- Lower
Config.maxRecordsForFeatureScoringto 1,600,numTrendingTagsTootsto 200 HashtagParticipationScoreruses the square root of the number of participations to tamp down runaway scores.- Use a Semaphore to limit concurrency of hashtag search API requests; add
Config.maxConcurrentTootRequests - Exclude followed tags from the pulling of hashtag participation toots (followed tags are already in timeline)
- Refactor common handling for cacheable toot fetches
- Rename
Config.maxTimelineTootsToFetchtoConfig.maxInitialTimelineToots - Create a
UserDataobject, expose auserDataprop onTheAlgorithm repairTag()now replaces thetag.urlproperty with link to the tag on the user's homeserver
- (Demo App) Add a section for hashtags the user participates in
- Add
Toot.simplifiedScoreInfo()method
- Add
HashtagParticipationScorerand import recent toots that contain hashtags the user participates in often in the feed - Poll for old records after initial load with
setInterval(). AddConfig.backgroundLoadIntervalMSandConfig.maxRecordsForFeatureScoringvariables
- Add the MOAR feature to inch towards continued backfilling of user data later on, after the initial load is not busy
- Add
trendingRanktoToot.popularity() - Standardize boolean logic around cache hits and misses
- Add
mastodon.artto list of no MAU servers - Reduce
Config.minRecordsForFeatureScoringto 240 in the hopes of improving startup speed (see TODO section of README)
- Add lastLoadTimeInSeconds prop to TheAlgorithm
- Upgrade
masto.jsto v7.0.0 - Decrease
Config.numTootsPerTrendingTagto 15, increaseConfig.numTrendingTagTootsto 250
- Parallelize the initial load as much as possible
- Use a looser definition 'containing' a hashtag: a toot contains a hashtag even if it just has the name of the hashtag as a substring (without the leading
#) UserData.followedTagsis just an array of Tags
- Use the
/api/v1/timelines/tag/:hashtagendpoint to pull trending tag toots in addition to search endpoint - Log the
Instanceserver info dict all at once - Increase Config.numTrendingTagToots from 100 to 150
- Add MastodonServer.fetchServerInfo() method to fetch all the available mastodon.v2.Instance data about the server instead of just MAU data
- Checkin missing
dist/changes from last release
timeString()method accepts locale argument- Move the bulk of the scoring code to
Scorer.scoreToots()method
- Add
TheAlgorithm.reset()method to completely clear browser storage - Export
timeString()helper method - Add
Toot.realToot()helper to find reblogs - Add
TheAlgorithm.statusMsg()helper
- Rename
TheAlgorithm.mostRecentTootAt()toTheAlgorithm.mostRecentHomeTootAt() Storage.getToots()returnsnullinstead of[]if there's nothing in local storage
- Move
getRecentTootsForTrendingTags()toMastoApi - Move
getMastodonServersInfo()fromMastoApiclass toMastodonServerclass
- Add
Config.staleDataSecondsdictionary to enable customized data refresh rates (rename oldConfig.staleDataSecondstoConfig.staleDataDefaultSeconds) - Implement
catchupCheckpointlogic so that refocusing the app will always poll new toots back to the last home timeline toot we already have - Refactor trending history methods to
trending_with_history.ts
Toot.buildToots()helper method
- Store an
updatedAtvalue with each data object in the browser storage and use that to determine what data is actually stale - Init
TheAlgorithm.loadingStatuswith"(ready to load)"during construction so it isn't empty until load is complete - Refactor a common fetchTrendingFromAllServers() method wrapper
- Sort trending toots correctly
- (Demo App) Make the refresh handling actually work by moving required vars and code into
useEffect()blocks - Force repull of trending data if the cache returns an empty array
- Call setDependentProperties() on result of fediverseTrendingToots()
- Set
Toot.trendingTagsproperty more accurately in setDependentProperties() - Add
Config.excessiveTagsPenaltyparam
RetootsInFeedScorercan useToot.reblogsBy.lengthto score (and therefore doesn't need to be aFeedScorer)RetootsInFeedScorerscores with the square of the number of retooting accounts the user follows- Remove
TrendingLinksScorer.trendingLinksproperty - Stop mutating the
Tootobjects inFollowedTagsScorer(now happens inToot.setDependentProperties()) - Set
Toot.mutedwhere necessary inToot.setDependentProperties() - Add
Toot.setDependentProps()static method to set props for array ofTootobjectss. move the setting of those props to the calls likeMastoApi.fetchHomeFeed()that do the initial Toot object building
- Consolidate all
Tootpost processing toToot.setDependentProperties()method - (Optimization) Make Account.webfingerURI a string instead of a method that returns a string
- Remove trending toot fetching from
MastoApi.getTimelineToots()(remove the method, actually).TheAlgorithm.getFeed()now handles trending toot retrieval - Penalize trending tag toots if they have more than
Config.excessiveTagstotal tags - Add
Config.timelineDecayExponentparam
- Use reverse chronological order sort in
DiversityFeedScorer - Stop mutating
DiversityFeedScorer.scoreDataduring scoring - Score toots with parallelized Promises instead of serially, add
Config.scoringBatchSizeparam
- Add
Config.staleDataDefaultSecondsparam, consolidateStorage.isStaleData()method - Add a 5 second timeout to public API calls via new
Config.timeoutMSparam - Implement a reload based on time of most recent toot in timeline (10 minutes is the trigger)
- Get rid of unnecessary
Toot.resolveAttemptedflag
- Optimize to only scan for and set
Toot.trendingLinksonce if possible - Make
Toot.imageAttachments,videoAttachments, etc. computed once inTootconstructor instead of methods
- Repair media attachments with URL arguments in
remoteUrl - Lower time between timeline pulls to 1 second
- Make scorers work with the original toot, not just with the retoot
- Use time of retoot not just original toot when scoring retoots
- Bump up
TRENDINGweight to 0.15
- Add scores for retooted account to
MostFavoritedAccountsScorerandMostRepliedAccountsScorer - Load followed accounts and tags in
getUserData(), store aUserDataobject onMastoApi - Refactor
initializeFiltersWithSummaryInfo()tofeed_filters.ts
- (Demo App) Add ability to bookmark toots
- Limit length of feed to
maxCachedTimelineTootsonly after scoring and sorting - Refactor filters serialize/deserialize methods to
feed_filters.ts
- Use lowercase when detecting a Toot's trending links
- Use lowercase when uniquifying trending links & tags
- Set all weights to 0 for CHRONOLOGICAL preset
- Remove
Toot.reblogsByAccts()method - Refactor
uniquifyByProp()collection helper - Include toots with trending links in LINKS filter even if they don't have link cards
- Remove
Toot.attachmentPrefix()method
Toot.containsTagsMsg()method
npm audit fixareact-router-domvulnerability in the demo app
- Add filter for Toots that mention the fedialgo user
- Check in missing
dist/files
- Add
.giftoIMAGE_EXTENSIONS - Store
TheAlgorithm.mastodonServerssooner - Unify blocked/muted account handling
- Refactor
shuffle()method for arrays - Lower default
NUM_FAVOURITESweighting - Add
Config.noTrendingLinksServersso we can skip scraping trending links from servers that don't support it. - Lower
Config.maxInitialTimelineTootsto 1,200
- Rename
TheAlgorithm.extractSummaryInfo()toTheAlgorithm.initializeFiltersWithSummaryInfo() - Allow things that user has reblogged into the feed
Toot.realAccount()method
- Preserve
MastodonServersInfoinformation like MAU - Tweak
Toot.describe()string
- Use
Account.webfingerURIinstead ofAccount.acct - Add
.webptoIMAGE_EXTENSIONS - Get rid of
Toot.homserverAccountURL()
- Rename
RetootedUsersScorertoMostRetootedUsersScorer - Remove unused exports for
TIME_DECAYandTRENDING
- Introduce
Accountclass
- Increase
Config.maxInitialTimelineTootsto 1500
- Cache the user's server side filter settings
- Expose
TheAlgorithm.mastodonServersproperty
- Fix duplicates ending up in
Toot.reblogsByon page reloads - Add
TheAlgorithm.loadingStatusmessage - Add
DISCUSSIONSpreset; tweakTRENDINGpreset
- Test release
- Tweak
TRENDINGpreset
- Refactor
MediaCategoryenum - Explicitly export all objects and variables required by the demo app
- Exclude
mstd.socialfrom default servers - Add `Reverse Chronological" preset algo
- Configure various algorithm weight presets that can be selected via
PresetWeightsobject - Add
TootScore.weightedScorevariable; makeToot.weightedScoresobject values reflect the trending multiplier - Resolve Toot to self (and log error) if there's an API failure when resolving
- Add
Toot.ageInSeconds()andToot.ageInHours()methods
- Include
Toot.repliesCountwhen scoringToot.popularity() - Add optional maxChars arg to
Toot.contentShortened()
- Replace links with
[domain.name]in trending link titles - Prefix trending links with
[domain.name]
- Remove unused learnWeights related cruft
- Add account name when describing no text Toots in trending list
Toot.homeserverURL()method to allow linking on the user's mastodon instance instead of remote servers- Fix display of image/video/audio only toots in Trending Toots section
- Better handling of no text toots in
Toot.contentShortened()
- Store and reload trendingToots; add
Toot.contentShortened()method
- [Demo App] Add Stick To Top checkbox for left panel
- Preserve
TheAlgorithm.trendingLinksfor use in client - Save trending links and data to local storage
- Bump
image-sizepackage for vulnerability fix (npm audit fix)
Algorithm.buildTagURL()helper method- Extract and preserve
TheAlgorithm.trendingTagsfor use in client DiversityFeedScorerlogs at DEBUG level- [Demo App] "What's Trending" accordion section
- Fix miscased
Scorer.tsfiles indist/package.
- Fix
unknownmedia type for video files with extension.mp4
- Fix demo app dependency
- Make
Polla filterable type
- [bug] Force removal of duplicats
Toot.reblogsByvalues - Exclude
bsky.brid.gyfrom MAU numbers
- Make sure
trendingRankis set correctly on trending toots retooted by people you follow
accountNameWithEmojis()andToot.contentWithEmojis()API methods
- [bug] Remove dupes from
Toot.reblogsByarray - Unified
Toot.realURI()method - Tweak default weights
- Convert
Toot.reblogBy(anAccount) toToot.reblogsBy(anAccount[]) - Make
DiversityFeedScorerproperly account for retoots
- [bug] Fix retoots being scored based on the retooter not on the original toot
- [bug]
videoAttachments()wasn't includinggifvvideos - [bug] export
WeightNameenum for usage in client app
- Adjustable global
Trendingmultiplier that's applied to cumulative score of trending toots of all types
- Add
TrendingLinksScorerto boost toots that contain Fediverse-wide trending links TrendingTagsScoreruses max ofnumAccountsnotlog2(sum(numAccounts))- Add blocked accounts to muted account list
- [bug] Add
@server.comstring toAccountobjects for users on the home server that didn't have it.
- Add
MentionsFollowedScorer - Add handling for audio
mediaAttachment
- Refactor a
MastodonServerclass for calls to the public API
- Add
Toot.isDM()instance method and filter option - Stop muted accounts from sneaking into the feed via trending toots
DiversityFeedScorersorts by MD5 of id to get random but repeatable ordering so scores don't bounce around as incremental loads happenChaosScoreruses a hashing function to generate a deterministic score instead ofMath.random()- Don't decide whether to reload feed (leave that to the client app using this package)
- (demo app) switch to sort filters by count instead of by name
- Remove followed servers that don't meet MAU requirements from trending data
- Standardize caching of data fetched from Mastodon
- [bug] Handle
FeatureScorernot being ready if page is reloaded
- Fix de/serialization of score data on
Tootobjects introduced byTootrefactor
- Enable
reloadFeed()method to return true after 10 minutes has passed since latest toot in timline - Refactor out a proper
Tootclass
- [bug] Fix server side filter application
- Pull and apply server side filters to trending toots manually because user's server side filters can't be applied to toots pulled from other servers
- Add numeric filtering (minimum replies, minimum reblogs, etc)
- Add filtering based on username
- Implement a real incremental load
- Convert the filtering of sources to the standard model
- [bug] Fix doublecounting of toot categories
- Allow inverting filters for apps and languages (not just hashtags)
- Standardize a
FilterSectionobject structure for app, language, hashtag, etc. filtering
- Rudimentary ability to keep loading more toots in the background after delivering the first batch
- Add scoring for raw number of retoots
- Centralize configuration and defaults in
config.ts
- Implement tag based filtering (blacklist and whitelist)
- Implement
TrendingTagsscoring (pull recent toots from tags that are trending into the timeline) - [bug] Fix followed accounts filter
- Add ability to filter based on the application used to toot
- Repair broken
mediaAttachmentsentries if possible
- Implement live filtering of the feed (for languages, followed tags, etc.)
- Add
setFeedInAppcallback parameter toTheAlgorithm.create() - Remove user's own toots from timeline
- Introduce
TootScoretype to hold all score info - filter out toots that match user's configured filters
- Use
localForagepackage for persistent state instead of browser's Local Storage which is capped at 10MB - Use
async-mutexto limit scoring to one thread at a time - [bug]
reblogsFeedScorershould only count retoots - [bug] reset the diversity scorer when rescoring
- Refactor
decorateWithScoreInfo()method - Rename
scores=>rawScoresandvalue=>score
- Add a
MostRepliedAccountsscore - Add a list of default servers to check for trending toots if user isn't following very many accounts
- Add 1 to score so if all weights are 0 the timeline is reverse chronological order
- [bug] default to 0 instead of erroring out on reweight
- Add
FollowedTagsScorer
reblogByshould be anAccountnot a string- Don't filter out replies from feed (filtering replies is now an option on the front end)
- Add
ImageAttachmentScorerandVideoAttachmentScorer - Improve scorer descriptions
- Make time decay param configurable
- Rename feature scorers