Rogger, the Run Logger
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Resources used to make this project can be found in this README
 (citations can be found in the code base as well,
using the [#] notation to index each source found on this page; for any reference to
the original version of Rogger, you can find information on how to find that under the
ELSE IN THIS REPOSITORY! Some may also be on just the server of the website itself,
and so you can't see the files, though I tried to be diligent about putting those citations
here. I also may have missed a few by accident.

The code for the old version of this site can be found at under the "refactor" and "master" branches (both master and refactor have citations that may differ from each other, so look at both of them)


[2] for picking colors
[3]   Google Fonts, from which you will find various fonts that were used throughout
      this site, loaded from the server
[4]   Padding seems to add width to at least divs, so the solution to this problem
      was found here:
[5]   For centering; this technique seems like common practice, and source is unknown
[6] for setting CSS to all elements of
[7]   How to hide scroll bars:
[8]   Bullet points as information separators idea taken from Google Play Music
      (where they are used to separate album stats like time)
[9]   <br>s used in this div for line breaks is an idea from
[10]  Used the table display trick from here for vertical alignment of text:
[11]  Profile picture overlapping banner in the center of the banner idea from some unknown
[12]  Whitespace can cause gaps between divs. Reduced font size to 0px to solve this problem.
      Source is unknown.
[13]  Removing drop down arrow for selects:
[14]  Using OneToOneField to mimic additional information added to built-in User model from Django documentation and unknown source (was used in previous project)
[15]  Passing csrfmiddlewaretoken into POST dictionary to fix the header thing not working is from and unknown source, but used
      in the previous iteraiton of Rogger
[16]  Used model reference from string found at this location to resolve circular dependencies
      on imports
[17]  Differentiating between different button presses in form submission from
[18]  Help with putting string in raw format for javascript safety: (used this answer and the comments on the answer for help)
[19]  Probably a commonly-used way to wrap a counter to mimic a ring buffer, but this code was at least sanity checked by, but possibly derived from, my knowledge that "Operating System Design: The Xinu Approach (Second Edition)" by Douglas Comer uses this technique
[20]  related_name naming scheme from (the FOO_set explanation part); also, I think I did this using-related_name-thing-to-resolve-migration-conflicts thing in the original Rogger project, suggested by a citation that I don't have on me right now, but this modification was recommended anyway by the django library when i tried to run the site, and I just followed those instructions, so citing the other resource may not be necessary
[21]  Using scrollIntoView() to scroll parent element to the element calling scrollIntoView() from unknown source
[22]  This conditional, for calculating if scrolling has reached the bottom, from multiple sources that are unknown
[23]  noMoreUpdates variable for keeping track of if we received notice that no more updates were available from the previous version of Rogger (codebase at, can't remember if I got this technique from an outside source
[24]  <br/> usage to break lines in ReportLab from unknown source
[25]  The strategy of allowing both approved and unapproved followers see user data if the privacy setting is set to public
      but then showing all follows that have occurred but still need to be approved when the privacy setting is public or more
      secure is from the previous version of Rogger; I don't think there are any resources that I used to get that strategy,
      but I can't remember everything that I used, so to be safe I will say that there is a possibility an outside resource helped.
      The "approved" attribute in the Follow model keeps track of whether a follow is approved, and, again, is only looked at
      if the user-who-is-being-followed's profile is not on the public setting.
[26]  This technique of a hidden form to be triggered from a remote button from unknown source(s).
[27]  Not sure if I used this kind of variable in the last version of Rogger and if there is a citation for it.
[28]  Using a presigned URL to control access to files in buckets is an idea from an unknown source.
[29]  Using middleware to remember when the user was last active from unknown source.
[30]  I was told by some unknown source that using the .dataset property in javascript isn't backwards compatible,
      so there was an alternate method discussed, which I believe was .getAttribute(), which suggested.
[31]  Having display names is inspired by Twitter (and probably inspired by others as well)
[33]  MIT License from via
[34]  These types are from and/or inspired by the original Rogger (see url for the original Rogger below in the "ACKNOWLEDGEMENTS" section),
      and they were inspired by, so they were not my own creation
[35]  These types are definitely from the original Rogger (see url for the original Rogger below in the "ACKNOWLEDGEMENTS" section),
      and they were from, so they were not my own creation.
[36]  To seek to the 0 position in a BytesIO before sending the file with boto3 from
[37]  Properly setting up the form for picture upload from
[38]  Using a table, tr, and td (and whatever tags show up that the browser puts in itself automatically) is
      an idea derivative to the answer(s) found here:
[39]  Using height instead of min-height to specify a minimum height and learning that I have to use it on
      a <td> element is from
[40]  Suggestion to use CodeMirror as a syntax highlighter is from
[41]  Confirming that escapejs is safe for use in Javascript strings that are within HTML files is from
[42]  I am not sure if this filter method to remove zeros from end of number is from someone else's idea. I feel like there is a chance it is, but I can't remember
[44]  This function name inspired by the name of Django's send_mail() function
[45]  Using the time.sleep() (or any time.sleep()-like function) function to rate-limit the emails being sent out is an idea from
      an unknown source.
[46]  The idea of creating this function is from the old Rogger, which also had a similar function
[47]  Chrome was complaining about how the CSRF cookie was not valid, so adding CSRF_COOKIE_SECURE and setting it to "True" to the
      settings file (which you can't see in this repository) is an idea from and (an)other unknown resource(s).
      Adding SESSION_COOKIE_SECURE to the site's file is a suggestion from the Django documentation and probably from as well.
      ( and was inspired by the aforementioned source as well.
[48]  Explanation of what I need to say to users to abide by the the EU Cookie law(s) is from and

This site has a lot of influence from Some major ideas from there (but possibly not all of them if my memory is failing me):
  Creating shoes and tracking mileage on them in logs/adding them to log entries
  Using a calendar layout (probably most influential is the ability to click on a date on the calendar to make a new entry for that date) (also, a lot of people hated the old calendar layout, so the new one is also in response to them)
  Workout creation layout
  Custom workout types (also a suggestion from a user)
  Allowing users' profiles to go completely private with no or close to no hint of the account existing
Instagram for inspiring the cursive "rogger" that you will see throughout the site (like on the navigation bar,
about page, maybe others I am forgetting).
The purplish-grey and white-ish color set used around the site is derivative of the greyish-purple and white that Slack, the collaboration app, uses, and I probably have seen similar colors to Rogger's purplish-grey and whiteish color set elsewhere around the web as well, so Rogger's purplish-grey and whiteish color set could be derivate of those, too. Further, I may have used more that just one purplish-grey and/or whiteish color in Rogger, so these citations apply to those as well. I also had the side bar on the home page vs. most of the rest of the site be the same color scheme as Slack (the side bar was the purplish-grey while most of the other backgrounds/empty spaces were white or close to white, at least in the default theme of Slack as of 10:37 PM Eastern, not daylight savings, on 2017.11.11). Seeing as I took design choices like that from Slack, Slack could have also influenced the site in other ways besides the sidebar-other-spaces thing and the general color set. I don't remember anything specific, but I am just putting this here to make sure I am "covering my bases" when it comes to citing.
Also, as I think I have stated elsewhere in this file, this site uses a lot of common features found around web
Evan Hamilton and Joel Christian to their tiny-but-appreciated direct and indirect contributions to the old project ( of which they were part of the coding team, and their probably ongoing indirect contributions to this one.

Thanks to everyone that submitted bug reports. Safari, the web browser, was very important in debugging, and less important but still important were other browser(s) probably including (but there may be others I am forgetting) Firefox, Chrome, Internet Explorer (unknown release number(s) like 6, 7, 8, 9, 10, 11, etc), Edge, mobile versions of these browsers or their derivatives (like the browser used in the Google bar in Android and the iOS Google App).

Thanks to everyone who suggested things to make the site better.

This site is built on the Django web development framework.

How to set up NGINX (the web server) to serve this Django app
is from,, (for telling me where to put the Rogger server configuration (somewhere in /etc/nginx/nginx.conf)),
and probably other unknown resources as well. (SEE OTHER CITATIONS BELOW, THEY TAKE PRECEDENCE)

Thanks to,, and other unknown sources, for helping debug the server.

Using json.loads() to convert strings with surrogate pairs into proper unicode for data import from a json file (for transferring between the old Rogger's "python dumpdata --indent <# of spaces indent>" output to the new database) is from and possibly others as well. Being able to transfer the data between two different databases via just
Django models, which is the idea that allowed me to generate the pseudocode that got the ordering of how to move the old data to the new site (in the end though, I didn't use the old database's
data with just models; I just used the pseudocode ordering), is from That site also may have pointed out to
me that I could use dumpdata to get the old data out of the old site. I suppose it is possible that that site outlines the entired original method I was going to use to transfer the data over,
now that I think about it, I just can't remember and if it was, I have modified it so that my data transfer code directly reads the output of "python dumpdata --indent <# of spaces to indent>".

Thanks to for clearing up
whether or not I can use Certbot and Let's Encrypt on my site and still stay compliant by licensing the site code under the MIT License (below).

Thanks to for helping me debug using Certbot and Let's Encrypt.

Thanks to for suggesting to use as a domain name registrar.

Using a virtualenv'd folder to house a Django project is an idea from (an) unknown resource(s) (high probability that is is from the Django's team's own django tutorials at, and maybe other resources as well).

Checking sqlite3 database for corruption using the PRAGMA integrity_check command is from

Deleting all Django sessions technique I used is from

How to install sqlite3 for Ubuntu (as the sqlite3 Linux download didn't work) is from

Explanation of what I need to worry about regarding the EU Cookie law(s) is from and I think resolved the issue on my Mac where pip couldn't install anything into the SIP-protected MacOS folder where Python is installed

It is probable that using systemd to start up (and coordinate) the uwsgi server for Rogger is a suggestion from Also, the structure of this file is based
off an example found at
and possibly elsewhere.

ExecStart command is a derivative of those found at, and possibly from,, and maybe other resources

Setting Type to forking is a suggestion from (an) unknown resource(s)

WantedBy usage (from unknown resource(s) and,
seems to be the best way to get this service running at boot, and possibly recognized by any systemd command.

Using the --home option for uwsgi is a suggestion from an unknown resource and discussed in

/etc/nginx/nginx.conf rogger SERVER DEFINITION CITATION SECTION

Putting this server definition here (/etc/nginx/nginx.conf) is from

All sections in the server configuration section talking about how Certbot is its manager were created and/or modified by Certbot, not me
(basically, for those without access to the file, this is the code that redirects non-HTTPS connections to HTTPS connections, and
and certificate setup)

Method of redirecting non-HTTPS requests in the nginx rogger server config (The "if ($scheme != "https")" if clause)
was made by Certbot, and confirmed for me
that this was a way to do that and also pointed out that I can still listen on port 80 in the same server definition to allow
those non-HTTPS connections to come in and get redirected to the HTTPS site.

Thanks to
for telling me what the variable is in the nginx configuration that controls how big a request is allowed through the server.
Limiting the request size using the web server instead of Django or something else is a suggestion from an unknown source.

This has been put in the nginx.conf file, and explanation for it is with it, along with its citations:
    # This server definition is used to reject requests that aren't for the domains processed by the server definition below.
    # The "return" usage is from (retrieved 2017.12.18) in the code under
    # 'In catch-all server examples the strange name "_" can be seen'. Putting this as the first server to make it "default"
    # so that other domains are processed here and not in the other server is probably from the same page and/or
    # Making sure that these requests stop here and not at Django so that I don't
    # get spammed with error emails is an idea from
    # -invalid-http-host-error. Even though this version of the site uses Nginx (and I think that site talks about Apache,
    # there might be some configuration used there that was directly, or more likely indirectly, relevant to what I wrote
    # for this server definition. Using two different listens for each port is an idea from Certbot which did this for
    # the server defition for Rogger.
    server {
      listen 80;
      listen 443;
      return 403;

# THE sudo apt-get update, AND THE sudo apt-get install nginx COMMANDS I RAN ARE ALSO FROM THERE
deb xenial nginx
deb-src xenial nginx
END OF STUFF THAT I ADDED TO /etc/apt/sources.list

DEPLOYMENT SERVER'S ROGGER INSTALLATION's citations (in addition to those that may have already been mentioned):
See citation [47]

Installation instructions I used for the production server (plus some other outside knowledge that I don't remember where it is from) were found here:
virtualenv:    With pip (not sure about source for this method of installation)
Django:        With pip (not sure where I got this from; may be recommended by the Django team themselves)
nginx: (they talk about modifying the /etc/apt/sources.list file, which I did)
pip:  (with the get-pip method + python3 instead of python)
ReportLab: (the README, with pip)
Boto 3: (with pip)
Pillow: (with pip, although ReportLab had already installed it as a dependency)
uWSGI: (with pip + "sudo apt-get install gcc" + "sudo apt-get install python3-dev")

Thanks to for mentioning that a SQLite 3 file is cross-platform (and I think cross architecture), which saved me
a ton of headache.

This site uses Django, JQuery, ReportLab, Pillow, Boto3, Let's Encrypt (a GREAT GREAT GREAT initiative) + Certbot (also FANTASTIC), nginx, Ubuntu 16.04 (the AWS variant), virtualenv, pip, CodeMirror, Amazon Web Services, and probably other things I'm forgetting to mention as well.

Thanks to Atom (developed by Github, I think) for being a (relatively) great text editor. It was used for the majority of the code that I wrote for this site.

The design of this site is inspired by all my experience using the web. The
navigation bar at the top, the search bar, the Material-design(by Google)-inspired
layout and encapsulation of objects, the reverse-chronological feeds, etc. are not
my own creation; in fact, you will find very few things that *are* my complete
original ideas when it comes to design and aesthetics.

Also, a ton of this site is based on experience with, which
is a running log site whose users' exported data I support for importing.

Entry textbox (when writing the entry) expands to fit all typed content:
  Kristina Kronauer
Back button (mostly) does not reset the calendar in the user view:
  Amelia Keyser-Gibson
  Charlie Hale
Custom units for types when displayed as totals for weeks, etc.:
  Nora Weathers
  Sam Fujimori
  Amelia Keyser-Gibson
Shoe mileage:
  Kristina Kronauer
Merv test dataset(s) (used for both import testing and general site testing):
  Eric Arnold
Differentiating between new workout entries and updated workout entries:
  Nora Weathers
Letting workout titles in calendar show completely instead of being truncated:
  Henri Drake
Importing Merv data/Exporting Rogger data:
  Eric Arnold (import only)
  Joel Christian
  Kristina Kronauer
Having an updates feed:
  Eric Arnold
Using a more traditional calendar in the user profile:
Allowing underscores in usernames:
  Eric Chesterton
Pace calculation of entries if distance and time length of workout are given:
  Greg Morgan
  Kristina Kronauer (I think)
French Localization
  Possibly Charlotte Lellman
Asking for Rogger "swag", which I responded to by making a fundraiser because people also wanted to give
money to keep the site running
  Somebody/Multiple sombodies
Giving positive feedback about the panel on the left for follows, and "new fonts" (though I think this was for the old site,, for a git commit that occurred near 2017.10.30)
  Charlotte Lellman
Pointing out that the profile page of a user scrolls and the calendar does as well (in the old site,; this was remedied in this version of the site
  Charlotte Lellman

For every other feature, you should also assume that there is a good chance it was a result of me getting
feedback from users.

People who helped debug (for the things discussed below that were debugged, there may be other people who contributed to debugging them as well):
-Tyler Fong
-Joseph Boyle
-Charlie Hale
-Brian Sokas
-Katie Pokorny
-Amelia Keyser-Gibson
-Kristina Kronauer
-Lukasz Tyler Olenginski
-Kelley Riffenburgh
-Evan Hamilton
-Flora Berklein
-Nora Weathers
-Sam Fujimori
-Greg Morgan
-Eric Arnold
-Charlie Marquardt
-Allison Guindon
-Nicholas Reynolds
-Zachary Gabor, Griffin Kaulbach, users "alphdollie" and "hdoll" (Issue: error gets thrown when no workout type is specified in new workout because they have not made any types, and the "Unknown" type has not been created for them)
-this page:, Greg Morgan, Allison Guindon, Nick Reynolds, Lukasz Tyler Olenginski, Lincoln Satterthwaite, Kristina Kronauer: for helping me debug that the browser will automatically look for a favicon, and will get a CSRF cookie if Django handles the request (as in not going to the static file URL) and returns a 200 status.
-Bernie Jones (for the above problem and also for debugging that usernames with spaces in them can get by the account maker), Zach Needell for the same usernames with spaces bug (calling django's reverse url lookup functionality failed with the URL regex I specified for getting the url to a user's profile page)
-user "thale" for automatic bug report suggesting that I had not done a make migration and/or migration when the backupType field was added to the "Workout" model in workoutLogging.models
-users that tried to make a new log entry but failed because they didn't know they were logged out (the new entry page allowed users through even though they weren't logged in) -- automatic bug reports were sent for those people's errors
-users "Ellie" and "nosbigibson" for their automatic bug reports that showed I had an index error for "pretty printing" python's Decimal type (I assumed that all Decimals would have a decimal point when converted to some string, which caused indexing problems)
-Matt Cohen for his automatic bug report for not importing django.contrib.auth.model's User model; that model is used to check to see if the user tagged in an entry actually exists
-the automatic bug report generated when some unknown person tried to access the "/search" resource without actually putting in something to search for
-the automatic bug report that an unknown person generated that triggered, in, an error that "creationForm" could not be found, which was an artifact of me moving code; I never changed that back to the real form's name (which is not creationForm) once I moved that code over
-an unknown user's automatic bug report that I think I had not imported shared.languageLocalization's "baseLocalization" variable into some place, but I forget where that import was
-unknown users' automatic bug report for helping me figure out why the 404 error template I created was not being found at the /hello resource
-Charlie Marquardt, Eric Arnold, maybe others for pointing out browsers not working with both www.rogger(beta).co(m) and rogger(beta).co(m)
-Lena Edelstein for pointing out that the date and time of comments were not local to the front-end's location
-Charlie Marquardt and Eric Arnold for helping to, I think, debug the fact that I had not made an A entry for my domain to route the domain to an IP
-Eric Arnold for pointing out that, for migrated workouts (from old to new site), some distances had too many decimals numbers
-Eric Arnold for checking that emails were being sent out properly (for some mechanism(s) that I can't remember, involved at least entry comments)
-Charlie Marquardt for pointing out that distances on the updates feed page were showing unnecessary 0s in the decimal portion (or just an unnecessary decimal portion) of the distance of workouts
-Charlie Marquardt for pointing out that scientific notation (a*eb, where a and b are numbers) was showing up for workouts on workout pages
-Charlie Marquardt for pointing out that PDF generation was throwing a server error (can't remember what that error was specifically related to, I think it had something to do with the fact that WorkoutWeek's getStats() function changed and the new version returned tuples instead of strings, so the tuple was passed to Reportlab (for PDF generation) instead of the a string, which caused an error)
-Mali Axinn for pointing out that logging in wasn't working for new users. Super weird bug. I haven't gotten a complaint about this until now, which is very confusing.
-Charlie Marquardt and Charlie Hale for pointing out that the domain wasn't routing to the old Rogger server when (I think) I was switching domain name service providers.
-Charlie Marquardt pointed out that the calendar would initialize to (I think) showing an adjacent or near-adjacent month to the current month in the old Rogger. This issue was resolved in this new version of Rogger.
-Joel Christian (and possibly others) who pointed out that IE support (I think primarily, if not completely, for older version of IE) for the old Rogger was bad. I made at least some of this site compatible with older versions of IE as a result, though honestly I stopped testing for IE a while ago.
-Joel Christian, and Sam Fujimori let me know that the site looked good. Eric Arnold said it is better-looking than the old version.
-Eric Arnold and others said that when writing the text of a log entry in the old version of Rogger, each press of the keyboard would make the cursor in the entry area to return to the start of the entry's text. So, for this project, I abandoned what was causing it (a hacked-up TinyMCE editor) for CodeMirror, which seems to have solved this issue.
-Mali Axinn (approximately 2017.9.26) and someone else (unsure of date when this occurred, sometime late summer 2017, I think): Mali's accounts needed to be deleted, so that helped me test that account deletion actually deletes everything related to that account, and that someone else had a bug that I created at least one account for to test out, so when I deleted those accounts, that helped to test that the account's data was being deleted. However, now that I think about it, it doesn't deleted all the information, yet, so I have to address that at some point. Account deletion is not a user-facing feature yet, but it will be at some point, so hopefully it is fixed by then.
-Those (currently unknown who) who trigged the old site's bug where the antivirus would go down, so images couldn't be scanned for viruses on banner and profile picture uploads, and the server would error out, which would send me an email with a bug report. That's how I found out about these situations, and the bug is sort of fixed in this site (there is no antivirus running, so the same error can't occur).

and others whose names I don't know, and almost certainly others that I cannot think of.

Beta Testers:
Charlie Marquardt
  -Creating workouts, trying out the updates feed on the home page, probably other things too
Eric Arnold
  -Creating workouts, commenting, probably other things too
Kelley Riffenburgh
Matt Cohen
Jossi Fritz-Mauer
Lena Edelstein
Rich Marisco
+ some others maybe

My mom, dad, and Eric Arnold helped with suggestions on how to cite things and just also with my stress management (and probably other things as well that I can't remember), so thanks to them. Eric suggested that I can email all the users of the site to ask them to reply telling me how they had helped out with the site, and then I can add them to the list of citations.

Also, Eric Arnold told me that I was getting questions on's message boards relating to Rogger and said that I should chime in to help address them and address the fact that was losing users due to spottiness of the site or other issues, and that I should encourage them to use Rogger as a replacement. He also might have answered questions on in representation of me as I did not want to log onto to do so.

LICENSE (MIT, from citation [33]):

Copyright 2017 Benjamin Cutilli

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.