Static site generation

Matholymp supports generating a static site with information about past competitions. This is done with the mo-static-generate script. Before using this script, you need to set up the directory that will contain the site. This will contain files staticsite.cfg and page-template, as well as a directory data/ with the information about past events. Some parts of the site are not generated by this script and need to be set up manually.

mo-static-generate currently expects there to have been at least one past event. Thus, if setting up a web presence for a new competition, you should defer running mo-static-generate until after the first event (although other parts of the site can still be set up).

mo-static-generate should be run from the directory containing the site. It reads the files listed above and generates other files (overwriting them if they already exist). It does not delete files even if they were generated by a previous run of mo-static-generate and are no longer generated because of changed data (in such cases, e.g., if the record for a person was removed because they were not in fact at the event they were listed at, the files must be removed manually).

Example files

The examples/static-site/ directory in the matholymp source distribution includes versions of staticsite.cfg and page-template that may be used as a basis for configuring the generation of your site.

The example shows a site accessed over HTTPS, since this is a good idea for the registration system, although all the data on the static site itself is public. It is expected that if both the static site and the registration system are used, the registration system uses URLs of the form registration/year/ relative to the top of the static site.

Site design

It is up to you to determine the visual design of your site and to set up an appropriate HTML template, using appropriate CSS styles, that implements this visual design.

If you wish, you can generate .html files directly with mo-static-generate and put your complete HTML template directly in the page-template file. Alternatively, you may wish to use some external templating system to apply your design both to the files generated by mo-static-generate and to the manually maintained parts of the site. You could, for example, configure mo-static-generate to create .php files (using page_suffix = .php in staticsite.cfg), with page-template containing the PHP boilerplate to include the bulk of the page template from other files. Or you could post-process the files generated by mo-static-generate rather than using them directly on the website at all.

You may wish to put extra manually-maintained content on event pages, such as links to regulations or solutions. To support this, staticsite.cfg specifies page_include_extra as text that goes on event pages to include such extra content; %(dir)s in that text is replaced by the name of the directory for that event. For this to be useful, you need some templating system (possibly as minimal as server-side includes, as shown in the example file) that can include such extra content when encountering such text. Similarly, scoreboard_include_extra is text that goes on scoreboard pages; %(dir)s in that text is replaced by the name of the directory for the event (not for the scoreboard itself).

Your page template should reference a stylesheet which provides styles whose names are specified in staticsite.cfg for various constructs in the generated pages. The corresponding styles used for EGMO may give a useful idea of some possibilities, although of course you will need to make your styles fit in with your overall site design.

Your page template, or a manually maintained page, should contain links to the overall countries/, events/ and people/ pages on the site. You also need to create a front page to the site manually.

Miscellaneous generated files

mo-static-generate generates some files that you may wish to use in your site, but are not used automatically. These are generated in the event/auto/ directory.

  • event-contact-listsuffix is an HTML fragment with contact details for each event, which you may wish to include in some manually-maintained page.
  • sidebar-event-listsuffix is an HTML fragment listing events in a form that may be suitable to include in a sidebar in your page template.
  • redirects-n is a file listing redirection rules to redirect accesses to the registration system for event n to the corresponding pages on the static site, so that public URLs for registration system pages continue to work after the registration system is shut down. These rules are in the format used by Apache mod_rewrite, which must thus be enabled in your Apache configuration if you wish to use such redirects. You will also need to set up Apache to use these rules.

Data files

mo-static-generate generates the site using data files in the data/ directory. These are UTF-8 CSV files starting with a byte order mark. The files for EGMO (egmos.csv, papers.csv, countries.csv, people.csv) may be useful in illustrating the format. The first file has a name that depends on short_name_url_plural in staticsite.cfg; the names of the other files do not depend on the event. The names of some columns in these files depend on the settings of num_key and official_desc.

The file events.csv has to be maintained manually; this means entering details of past events, entering details of new events when announced and putting in medal boundaries after each event. The other files can be updated during and after each event by the scripts mo-static-papers-import and mo-static-import, as described below.

Some columns in events.csv are optional, and are not present in the example for EGMO but may be added if certain information varies from event to event so cannot go in staticsite.cfg. A column Honourable Mentions Available may be used to specify whether the rules of a particular event allowed for Honourable Mentions to be awarded; a column Distinguish Official Countries may be used to indicate whether there was a distinction between official and unofficial countries that should be reflected in the lists of countries and results. The Age Day Description column, present for EGMO, is also optional.

Creating the other files initially, with details of past events, is more complicated. You may start with files simply containing the CSV header row (with BOM). That will suffice to add data for new events using mo-static-papers-import and mo-static-import.

To add data for past events, you need to put it into the correct format for these CSV files (which includes identifying when the same person or country was at more than one event and using that to determine whether to assign new Person Number or Country Number values); you also need to copy papers and any photos or flags into the locations given in the relevant CSV columns. Because this depends on the form in which you have the data for past events, there is no general solution to this. You might have spreadsheets with data, in which case it may be appropriate to convert those to CSV format and then write your own Python script to convert that CSV file into exactly the right format. You might have web pages that need screen scraping to extract the data from tables on those pages. For older events you might have data on paper that needs scanning and careful proof-reading (in such a case, it would be a good idea to make the scans available on the site as well, in case any questions arise about possible mistakes).

It may well be convenient, when adding data for past events, to put it in the format expected as input to mo-static-import and then use that script to deal with assigning person or country numbers. This input format is almost the same as the format of the countries.csv and people.csv files on the static site; the script (matholymp/scripts/ should be examined for the details of how the formats differ (in particular, the different meanings of Person Number and Country Number in the input files).

Special prizes are represented in people.csv by putting Special Prize in the Extra Awards column. If different types of special prizes are distinguished, this column may give a name or description of the prize (in general, it can contain a comma-separated list of extra awards, formatted as if the single row of a CSV file).


Matholymp does not currently support results of past events with partial information (such as total scores without scores on individual problems, or names not matched to scores). If you would like to put up such partial results, please contact me so we can work out how best to handle them. There is no problem, however, with putting up information where results of contestants are present but details of leaders and staff are missing, and then adding the details of those other people later when available.

Static site maintenance tasks

The following describes how to carry out various maintenance on the static site. In all cases, the directory where you run the listed commands should be the top-level directory for the static site, containing staticsite.cfg.


To regenerate the site (needed after any change to the configuration or data, including after following any of the instructions below for other tasks):


When registration opens

Ensure that the relevant event is described in events.csv, and list the number of the event in event_active_number in staticsite.cfg.

Adding papers

To add a particular day’s papers (day 1 in this example) to the site, where mo-document-generate was used to produce papers with a logo on them, rather than papers being printed on paper with a pre-printed background design:

mo-static-papers-import --day 1 input-directory

where input-directory is the directory in which mo-document-generate was run to generate the papers, with the data/ subdirectory containing its input CSV files and out/ containing the output PDF files. See Document generation for details of the use of mo-document-generate to generate those files.

To add a particular day’s papers (day 2 in this example) to the site, where papers were printed on paper with a pre-printed background design, and both versions with and without that design are to be added to the site:

mo-static-papers-import --background --day 2 input-directory

In both cases, you may omit the --day day option if you are adding all papers at the same time, and must omit it if there is only one day at the competition.

If the papers being added to the website have corrections relative to the versions used in the exam, you may wish to edit the Description column in papers.csv to note this.

Adding data after an event

This should be done once the final scores and medal boundaries have been approved (and once any known corrections to participant names or other public details have been entered in the registration system). Ensure that the data for the relevant event in events.csv is complete, including the number of problems, the maximum number of marks for each problem and the medal boundaries. Choose a directory (input-directory below) outside the website for mo-static-import to download files into. Make sure that event_active_number is set in staticsite.cfg; that is required for mo-static-import to download files automatically. Then:

mo-static-import input-directory

If this is the first event, at this point you should fill in Country Number for the host country in events.csv before regenerating the site (the number not having been allocated before then; this is the only reason it is not currently possible to use mo-static-generate before the first event).

If you wish to use the redirections from the registration system to the static site, you may add them to your Apache configuration after regenerating the site. Before doing this, make sure that anyone using the registration data administratively (e.g., to plan airport connections for departures) has all the data they need from the site.

It is also possible to run mo-static-import with files downloaded manually from the registration system rather than having it download them automatically. To do so, download the following files from the registration system (the lists of countries and people must be downloaded while not logged in administratively), and put them in the directory input-directory: the list of countries (countries.csv), the list of people (people.csv), the ZIP file of flags (, the ZIP file of participant photos (, the RSS feed of scores (save it as scores-rss.xml). (The ZIP files do not need to be unpacked; if they are, the directories flags/ and photos/ will be used instead of the ZIP files.) Any files already present in that directory will be used by mo-static-import in preference to downloading files automatically.

Removing a photo

If someone wants their photo removed from the static site, remove the files from the relevant directory (note that there may be multiple copies of it, for someone at multiple events, and thumbnail versions that need to be removed as well) and remove the entry or entries from the Photo URL column for that person in people.csv, before regenerating the site.

Removing a person or merging two people

If it turns out that a person’s record on the site (generally, or for a particular event) should be removed because that person was not present at the event they are listed at, or if there are multiple person numbers assigned to a single person at different events, then the relevant data needs editing directly.

To remove a person, delete the problem rows from people.csv. Remove any corresponding photos for the events that person was in fact not at. If the person was not at any event, remove their directory under people/. Then regenerate the site.

To merge two (or more) records for a person, decide which person number is to be canonical for that person. Change any rows in people.csv with the noncanonical person numbers to use the canonical number. Move any photos from the directories with the noncanonical numbers to the directory with the canonical number, update the Photo URL columns accordingly and delete the noncanonical directory. Regenerate the site. If you wish, also add redirects in the web server configuration from the URLs of the removed directories to the canonical directory.


If the highest allocated person number is removed, a future use of mo-static-import will reallocate that number to another person. You can avoid this by temporarily creating a dummy entry with that number in people.csv before running mo-static-import, then removing that entry afterwards. A future version of matholymp may provide a more automated way of handling removing and merging people.