A project to consistently update statistics and discover the most interesting preprints published on the journal 《SHIT》.
- Automated Statistics Update: Regularly scans the journal for new preprints, updating key stats automatically.
- Highlighting Preprints: Helps surface and highlight the most interesting or noteworthy work, based on automated analysis.
- Modular Processing: Flexible post-processing, ranking, and result formatting.
.
├── .idea/ # IDE settings (safe to ignore)
├── _daemon.py # Main daemon or entry point for background/stat update processes
├── enumerate_configuration.py # Loads and manages configuration for the stats sniffer
├── env_playground.py # Environment handling and experimentation
├── lifecycle.py # Controls job/task lifecycle, init, teardown, etc.
├── post_processing.py # Handles processing of scraped data after main tasks are done
├── post_processing/ # Additional scripts/assets for post-processing
├── result_algorithm.py # Core logic for generating, ranking, or summarizing preprint statistics
-
Setup your environment
- Make sure you have Python installed (also make sure you meet all dependency requirements as there are no requirements.txt).
- Configure
enumerate_configuration.pyif you will. - Add an environment variable "SHIT_API_KEY" in your system's environment, apikey could be found using your own 《SHIT》 account and by packet analysis.
- or you can however just directly code your key string into the configuration, who cares except yourself
-
Run the Stats Sniffer
- Before starting: run
env_playground.pyto generate initialized dataset files required for the rest parts of the project - Typical entry point:
_daemon.pypython _daemon.py
- Before starting: run
-
Extend or Customize
- Tweak
result_algorithm.pyto change how preprints are selected/ranked. - Add custom post-processing steps in
post_processing.pyor thepost_processing/folder. - For testing or experiments, use
env_playground.pyandpost_processing/post_playground.py.
- Tweak
-
Output Structure
lifecycle.py: attach the newest data captured when running and attach them to/stats/dataset.bin(binary raw dataset) and/stats/meta-id-refmap(.json map |id_str|->|metadata dict|)post_processing.py: reads all data in dataset.bin and calculating statistical metrics for each preprint subject. Result stored in/stats/integrated_dataset_0_-1_cp_${time.time()}.binresult_algorithm.py: reads the output file ofpost_processing.pyspecified by file-scoped variablepathdeclared MANUALLY(which means to you have to change it overtime), saves a similar file withpost_processing.py- Results would be able to visualize when the output of
result_algorithm.pywas specified inpost_processing/post_playround.py. - Explore the project to figure out more.
-
Configuration
interval: float: interval between eachlifecycle.pylogs and write records of data into the file; default: 60*5 seclifecycle: float: length of period for_daemon.pyto restartlifecycle.pyin order to avoid increasingly high memory usage; default: 1200 secdatetime_critical: float: threshold forpost_processing.pybut notlifecycle.pyto reject preprints which are published too early; default: before 00.00 UTC+8 Saturday of the last week(this week if you're on Saturday or Sunday themselves) when the configuration is loadedlimitN: int: a parameter passed onto api call about how much pieces of preprints' data you are going to fetch in a single call; default: 50 (maximum possible for latest shit api impl, Apr 3 2026)count_threshold: int: threshold oflatest_rated_countforpost_processing.pybut notlifecycle.pyto reject preprints with few people rated, less than but not included; default: 6apikey: str, headers: dict: parameters passed onto api call;
Contributions (code, new features, bug reports) are warmly welcomed! Feel free to fork, file issues, or submit PRs. Though my time is always pretty limited.
《SHIT》 stands for Science. Humanities. Information. Technology.
Or originally: Study of Higher and Inner Trash.
A tongue-in-cheek community for all creative works.
Website: SHIT JOURNAL
Downstream project: SSMH
This project is still under construction and open to all ideas, no matter how ridiculous!