some undocumented neocities mechanics

techno-mystic reveals esoteric secrets from years of research

last update: 4/17/24

discovered through personal experience, experimentation, and a very poor analysis of the open source neocities code (i have some experience coding but none whatsoever with the language ruby, which most of the important bits are written in).

※ profile activity updates: if an html file has been updated on a site and the site’s last activity update was more than 24 hours ago, a new activity update will be generated. no activity updates are generated by editing css, xml, or script files, nor if photos are uploaded. if an activity update is manually deleted, there will still be a 24-hour cooldown before a new activity update can be generated for a site. the activity update main thumbnail/screenshot will be of the first html file edited, the one that created the activity update in the first place, and then the subsequent smaller thumbnails will be of the next three html files that were edited during that activity update's 24hr period. this is a recent change, previously the order was reversed and the main thumbnail/screenshot was always of the latest distinct html file edited during the 24hr period, and so the thumbnail/screenshot could change between many different pages over the course of an activity update's lifetime. presumably the new system is easier to understand (always the first page you edit), and less taxing on the backend (no need to continue generating thumbnails, once the main one is in place that's it for the day).

※ site activity update screenshots are taken using a window size of 1280x960 (verified experimentally using inline javascript)

※ to appear on global activity page, a site must not be marked as nsfw, must not be shadowbanned, and must have at least 3,000 views and 2 followers.

※ to appear on the browse page, a site must have at least 100 views, or 10,000 for the default sort or the "tipping enabled" sort.

updated ※ shadowbans (referred to in the code as “is_a_jerk”): the shadowban requirements were revised again on 4/16/24 in response to the Federi Affair. regardless of follower count, a site now gets shadowbanned if it is blocked by more than 50 users. additionally, sites that themselves block more than 100 users now get shadowbanned (mass blocking was a favored enforcement tactic of the federi regime). as far as i can tell, the last line in the jerk detector is currently redundant (due to the && blocks_count > 60 at the end, the whole statement is only true when the earlier line return true if blocks_count > BLOCK_JERK_THRESHOLD * 2 is also true, since BLOCK_JERK_THRESHOLD = 25. maybe it is meant to be && blockings_count > 60?), perhaps someone with a github should alert kyle. shadowbanned sites are suppressed from the global activity feed and are only allowed to comment on their own profile pages or those of sites that follow them.

※ for some reason you can like your own site activity updates or comments although it's probably uncouth to do so. i feel like i understand the code well enough now that i could submit a pull request fixing this issue, but i find the jankiness endearing.

※ an rss feed of site activity updates is available for any site, even ones with site profiles disabled (as long as you know their username): neocities.org/site/[username].rss

※ even if a site has profile disabled, it is still possible to view their followers/following using these two links, as long as you know their username: neocities.org/site/[username]/follows
neocities.org/site/[username]/followers

※ sites that have marked themselves nsfw in the settings are very difficult to find in the neocities interface, they do not appear in the global activity feed nor can they be found under any of the visible browse settings. however, they can still be viewed on the browse page by manually passing in the "is_nsfw=true" parameter to the url like so:
neocities.org/browse?is_nsfw=true
the sort buttons on the page won't work for the nsfw sites, but you can pass in the different sort parameters manually to sort them:
neocities.org/browse?is_nsfw=true&sort_by=last_updated
it seems there are some sites that use the nsfw tag just for hiding themselves, like the neocities blog or the site of kyle drake (benevolent dictator of neocities).

※ the maximum file upload size is 100mb and the maximum number of sites that can be followed on one account is 2000 (raised from 1000 on 3/27/2024, it seems a longtime user and prolific follower finally hit the limit and requested a raise. wonder what their feed must look like...)

※ the maximum comment length is 420 characters (this is accompanied by a comment in the code: # Used to be the limit for Facebook.. no comment (PUN NOT INTENDED).).

※ to be "allowed" to comment, a site must be at least one week old and have been updated at least twice. i have not tested this but from the code, there appears to be a limit of 5 comments per day for users that aren't supporters. this limit may or may not apply only to comments made on other users' sites. there also appears to be a way for admins to manually ban sites from commenting.

※ to comment on a site or a site's events, the commenter must not be blocked by the site or blocking the site, the site must have profile/commenting enabled, and the commenter must be "allowed" to comment (see above). additionally, shadowbanned sites are only allowed to comment on their own site or sites following them.

※ neocities is somewhat picky about image file extensions that are capitalized, and will not generate thumbnails for them. however, they will display in sites just fine as long as the path to the image includes the capitalized file extension in the html img tag src attribute. incidentally, using the "※ " character makes the neocities site editor act a little funny visually.

※ the site name displayed on neocities is taken from the "title" tag of index.html in the site's root directory, the only site file which neocities won't let you delete.

※ the "site traffic stats" update every day at midnight GMT/8 pm EST.

※ profile pages only display the total view count for a site, but the total hit count for a site can be found using the "info" api call for a site (e.g. https://neocities.org/api/info?sitename=[username]). going to the stats page and downloading the data as a CSV will include bandwidth usage info as well, although downloading stats can only be done for one's own site (the info api call works for any site as long as you know the username). i'm not sure what units bandwidth usage is measured in, though.

new ※ it's possible to send a one-way pseudo-DM by making a post on a site's profile page and then immediately deleting it, thanks to neocities email notifications. although the post will no longer be publicly viewable, an email notification with the post's contents will still be sent to the site's associated email address, provided that the site hasn't unsubscribed from neocities email notifications.

※ the "New Followers" thing on a site profile shows new followers from within the last month.

updated ※ for a long time, the mechanics behind the default "most followers" sort on the browse page were poorly understood. it can't be based solely off of follower counts, because many have noticed that there are quite a few examples of "misranked" sites even on the front page, sites with fewer followers that appear ahead of sites with more followers. the only thing that seemed to tie the misranked sites together was that they generally followed very few other sites, which led early investigators like bikobatanari (rip) in this post to conclude that the ratio of following-to-followers must be taken into consideration somehow (the link is currently dead but i'm leaving it up in case biko ever comes back. it seems that his aversion to attention finally led him to delete his site). biko didn't have any hard evidence but seemed to be on to something, so i played around with the numbers for a bit. ultimately i couldn't find any way to reproduce the rankings using ratios, so i was forced to conclude it was based off of something else (my theory at the time was that hidden followers from sites with profiles disabled were skewing things). HOWEVER, months later, it seems that there has finally been a break in the case, by none other than neocities' current former leading expert on clout, federiefederi. in an "important announcement post" published on 4/8/24, they claim that "...your order in the list of the most followed sites is the number of your followers minus the followers you follow." what this means is that mutuals do not count for the most followers ranking. this feels correct to me and i'm sure the federis researched it obsessively, so i'm going to endorse it without verification (i'm lazy, writing a script that counts a site's mutuals sounds like too much work. this is probably why i didn't discover the formula during my own brief investigation.)

※ the "special sauce" sort works by scoring sites using the following algorithm:

  
			1 SCORE_GRAVITY = 1.8
			2 
			3 def compute_score
			4	points = 0
			5	points += (follow_count || 0) * 30
			6	points += profile_comments_dataset.count * 1
			7	points += views / 1000
			8	points += 20 if !featured_at.nil?
			9
			10	# penalties
			11	points = 0 if changed_count < 2
			12	points = 0 if api_calls && api_calls > 1000
			13
			14	(points / ((Time.now - updated_at) / 7.days)**SCORE_GRAVITY).round(4)
			15 end
				

line 5 heavily favors follower count, line 6 favors profiles with many comments, line 7 favors high view counts. line 8 gives a bonus based on if a site has been featured (not sure in which direction), although practically this probably has very little effect since i don't think i've ever seen the featured sites change. line 11 penalizes sites that have not been changed by nullifying their score, and line 12 does the same thing to sites that use the api too much (probably to punish sites that use scripts to update constantly, like those weather sites). line 14 heavily favors sites that have updated recently.