Giter Club home page Giter Club logo

workout-tracker's Introduction

A workout tracking web application for personal use (or family, friends), geared towards running and other GPX-based activities

Self-hosted, everything included.

Heavily inspired by FitTrackee ❤️.

Getting started

Docker

Run the latest master image from GitHub Container Registry (master and release images are available for amd64 and arm64):

# Latest master build
docker run -p 8080:8080 ghcr.io/jovandeginste/workout-tracker:latest

# Tagged release
docker run -p 8080:8080 ghcr.io/jovandeginste/workout-tracker:0.11.3
docker run -p 8080:8080 ghcr.io/jovandeginste/workout-tracker:0.11
docker run -p 8080:8080 ghcr.io/jovandeginste/workout-tracker:0

# Latest release
docker run -p 8080:8080 ghcr.io/jovandeginste/workout-tracker:release

Open your browser at http://localhost:8080

To persist data and sessions, run:

docker run -p 8080:8080 \
    -e WT_JWT_ENCRYPTION_KEY=my-secret-key \
    -v $PWD/data:/data \
    ghcr.io/jovandeginste/workout-tracker:master

or use docker compose

# Create directory that stores your data
mkdir -p /opt/workout-tracker
cd /opt/workout-tracker

# Download the compose.yaml
curl https://raw.githubusercontent.com/jovandeginste/workout-tracker/master/compose.yaml --output compose.yaml

# Start the server
docker compose up -d

Natively

Download a pre-built binary or build it yourself (see Development below).

Eg. for v0.11.3 on Linux x86_64:

wget https://github.com/jovandeginste/workout-tracker/releases/download/v0.11.3/workout-tracker-v0.11.3-linux-amd64.tar.gz
tar xf workout-tracker-v0.11.3-linux-amd64.tar.gz
./workout-tracker

To persist sessions, run:

export WT_JWT_ENCRYPTION_KEY=my-secret-key
./workout-tracker

This will create a new database file in the current directory and start the web server at http://localhost:8080.

Screenshots

Login page

Login / registration form

  • new users have to be activated by an admin
  • registration can be disabled

Dashboard

Dashboard view with:

  • personal totals
  • running records
  • a calendar view
  • recent activities (by you and other users)

Overview of workouts

Overview of all your activities, with summaries. The columns are sortable.

Details of a single workout

Details of a workout, with:

  • a zoomable, dragable map of the GPX track with more details per point
  • many summarized statistics
  • a breakdown per kilometer or per mile
  • track color based on elevation of the segment
  • graph of average speed and elevation per minute

Tooltips for even more information

  • green and red circle are start and end points of the track
  • every point on the track has a tooltip with a summary at that moment
  • hover over the breakdown per kilometer to highlight the point

Upload your files

  • Upload one or multiple GPX files.
  • Pick the type (running, cycling, ...) or let the application guess based on average speed
  • The files are parsed when uploaded: statistics and other information are calculated and stored in the database (serialized).

Statistics to follow your progress

  • Graphs showing monthly aggregated statistics.

Basic multi-language support

  • Switch between (supported) languages
  • Use the language configured in the browser (default)
  • Very limited amount of languages supported for now 😄
  • Re-calculate all previously uploaded workouts (useful while developing)

Responsive design

  • Usable on small and medium screens

Light and dark mode

  • Browser decides whether to use light or dark mode, based on your preferences

Configuration

The web server looks for a file workout-tracker.yaml (or json or toml) in the current directory, or takes it's configuration from environment variables. The most important variable is the JWT encryption key. If you don't provide it, the key is randomly generated every time the server starts, invalidating all current sessions.

Generate a secure key and write it to workout-tracker.yaml:

echo "jwt_encryption_key: $(pwgen -c 32)" > workout-tracker.yaml

or export it as an environment variable:

export WT_JWT_ENCRYPTION_KEY="$(pwgen -c 32)"

See workout-tracker.example.yaml for more options and details.

Other environment variables, with their default values:

WT_BIND="[::]:8080"
WT_LOGGING="true"
WT_DEBUG="false"
WT_DATABASE_DRIVER="sqlite"
WT_DSN="./database.db"
WT_REGISTRATION_DISABLED="false"
WT_SOCIALS_DISABLED="false"

After starting the server, you can access it at http://localhost:8080 (the default port). A login form is shown.

If no users are in the database (eg. when starting with an empty database), a default admin user is created with password admin. You should change this password in a production environment.

API usage

The API is documented using swagger. You must enable API access for your user, and copy the API key. You can use the API key as a query parameter (api-key=${API_KEY}) or as a header (Authorization: Bearer ${API_KEY}).

You can configure some tools to automatically upload files to Workout Tracker, using the POST /api/v1/import/$program API endpoint.

FitoTrack

Read their documentation before you continue.

The path to POST to is: /api/v1/import/fitotrack?api-key=${API_KEY}

Development

Build and run it yourself

  • install go
  • clone the repository
go build ./
./workout-tracker

This does not require npm or Tailwind, since the compiled css is included in the repository.

Do some development

You need to install Golang and npm.

Because I keep forgetting how to build every component, I created a Makefile.

# Make everything. This is also the default target.
make all # Run tests and build all components

# Install system dependencies
make install-deps

# Testing
make test # Runs all the tests
make test-assets test-go # Run tests for the individual components

# Building
make build # Builds all components
make build-tw # Builds the Tailwind CSS output file
make build-server # Builds the web server
make build-docker # Performs all builds inside Docker containers, creates a Docker image

# Running it
make serve # Runs the compiled binary
make dev # Runs a wrapper that watches for changes, then rebuilds and restarts
make watch-tw # Runs the Tailwind CSS watcher (not useful unless you're debugging Tailwind CSS)

# Cleanin' up
make clean # Removes build artifacts

What is this, technically?

A single binary that runs on any platform, with no dependencies.

The binary contains all assets to serve a web interface, through which you can upload your GPX files, visualize your tracks and see their statistics and graphs. The web application is multi-user, with a simple registration and authentication form, session cookies and JWT tokens). New accounts are inactive by default. An admin user can activate (or edit, delete) accounts. The default database storage is a single SQLite file.

What technologies are used

The application uses OpenStreetMap as its map provider and for geocoding a GPS coordinate to a location.

Compatiblity

This is a work in progress. If you find any problems, please let us know. The application is tested with GPX files from these sources:

  • Garmin Connect (export to GPX)
  • FitoTrack (automatic export to GPX)
  • Workoutdoors (export to GPX)

TODO

  • write tests!!!!!
  • add support for authentication through a reverse proxy
  • make a dev-flag that doesn't embed all files in the binary
  • add support for generic database drivers
    • added support for MySQL, but untested so far
    • added support for Postgres by @icewind1991
  • add support for other types of import files (eg. Garmin fit files)
  • see if htmx is worth using
    • first I need a use case

workout-tracker's People

Contributors

bbbutch avatar carteakey avatar icewind1991 avatar jovandeginste avatar pixelspark avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

workout-tracker's Issues

Unable to edit Workout

Just going through my imported Workouts from FitoTrack and noticed one had a top speed of 20km/m near the end.
So I wanted to see if I could trim the walk to remove the last few mins. But I get the following error when I press the edit button:

image

I'm not sure if a log file records any further information or not as I only have the /data folder exposed on Unraid.
If an error log is created would it be possible to have a copy stored in /data with the database file?

Integration with Garmin Connect

First off, awesome work - love what you've done here!

From an architectural perspective when implementing I'd assume other services should also be considered (Strava etc.), but for my own use case I'd like to see an automatic import (on each training session) from Garmin Connect's API (preferably the PUSH approach for instant updates - but also sync/manual import incase of downtime?)

Is this something that's on the roadmap or being considered?

Add imperial units

Thanks for the app! Would it be possible to add imperial units like miles instead of kilometers?

Markdown support in Notes

First of all amazing project it took 5 mins to spin up on Unraid.

Is it possible to support markdown in the notes field? I'm thinking on using it for instructions for hikes etc.

Once again thank you for an amazing project.

[Bug] Viewing "Other Users" partially renders your Dashboard & not theirs.

View of my summary Dashboard:

(Still need to trim some walks, especially that 27.31 mph walk 😉 )
image

If I click on User 2, I get User 2's calendar workouts but it still displays my summary:
image

View of User 2, from their login:
image
(Need to correct a number of User 2's workouts, as many come up with 0 miles due to long pauses between walks I think)

Issue with GPX exported from Workoutdoors

Great project!

When importing a GPX generated by the Workoutdoors iOS app, I get this error: constraint failed: NOT NULL constraint failed: workouts.date (1299).

Importing a GPX generated by Strava from the same workout works. The difference appears to be that the Workoutdoors file does not have a <time> element under <metadata> in the GPX, whereas the Strava one has it. The Workoutdoors file does have <time> items under each track point:

<gpx version="1.1" ...>
<metadata><name>Wednesday Evening Run</name></metadata>
<trk><name>Wednesday Evening Run</name><type>running</type>
<trkseg>
<trkpt lat="xxx" lon="xxx">
<ele>-30</ele><time>2024-02-28T17:26:34.000Z</time>

Perhaps the importer could use the earliest date in the file in case a date under metadata is missing.

I can have a go at implementing this myself if such feature would be desirable. If so any guidance on where to start would be appreciated (i.e. which part of the code to look)!

Wishlist: REST API

I like the simplicity of this app, and I would love to see a REST API accessible on this so that I can integrate it into my Home Assistant instance, some ideas could be:

  • Pull workout data
  • Pull / Sync Workout calendars

Thank you, and great work!

Disable Registration

Currently on the login page anyone can register an account.

Would it be possible to add a variable to disable registration on the login page please?

Loving the project and your response to my other issue was really appreciated!

Editing workout defaults type to running

When editing a workout the "Type" defaults to running.
So if you don't realise you can change your workout type by mistake.
Would it be possible it reads the current "Type" and shows that as the default, that way when you "Update workout" your not changing the type, but you still have the option to do so if needed.

image

Timezone

Great project!

When I try to set the timezone by clicking my username on top and then selecting timezone and clicking "update profile" I am not sure it "sticks". Next time I go to that same page, "Timezone" is empty. (Same goes for language after I have selected it).

I notice my workout (I only have one so far) is off in time - most likely due to the timezone not being set.

Maybe I am doing something wrong .... ?

Disable Socials

Would it be possible to disable the share to socials (facebook, whatsapp etc) options underneath the GPX maps.

It would be good if this could be managed through a variable?

Thanks again for the other requests you've actioned.

After upgraded DB workout needs to manually refreshed

Hi,

I have started my activity with release version 10.5.
I have imported 5800 workouts. Worked fine.

The Next release what I used as an upgrade was 12.1. Start automatically did the upgrade. The application loads perfectly and even lists the workouts and charts. However, If I click on one particular workout for details I got:

{"message":"Internal Server Error"}

In the log I can see:

8:21PM ERR template: workouts_show.html:65:45: executing "workouts_show.html" at <.StatisticsPer>: error calling StatisticsPer: runtime error: invalid memory address or nil pointer dereference app=workout-tracker version=v0.12.3 sha=6a69273150cab3138749ee5979d462bf959e58ee module=webserver request.time="2024-04-13 20:21:34.73549021 +0200 CEST" request.method=GET

If I click on the workout list view I can make a "refresh". It fixes it.
However, I don't want to do it on more than 5000 entries.

Is there a way to trigger a refresh for all workouts? or is it a bug?
Now I tried 12.3 release as well, but it is the same.

Inconsistencies with time

Hello,
I have imported a bunch of workouts, but the calendar is displaying the timing of one of them wrong. I assume its basing it off UTC and has meant a workout I did during the day is over two days now.

Here is the calendar showing its over two days:
image

Here is the average speed / elevation graph showing the correct times at the bottom:
image

Just want to say thanks for making this, amazing project so far!

Raspberry Pi4 support

Hi,

I tried the docker ony my RPI4 but always get this:
The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

Is there a simple fix?

The project looks really nice and I would love to use it :)

Thank you!

Export GPX files

Loving the app, would it be possible to add functionality to export a gpx file from a workout please?

Download Workout no longer working

Just tried to download a workout so I could edit it. As I need to trim the last section. But I get the following error.

image

It then just returns you back to the /workouts page

Output from Docker, doesn't really give any details?

{"time":"2024-04-13T13:23:13.409458499+01:00","level":"INFO","msg":"Incoming request","app":"workout-tracker","version":"master","sha":"e0a914e06295043ff333727a9780f262715fe778","module":"webserver","request":{"time":"2024-04-13T13:23:13.401963934+01:00","method":"GET","host":"IpAddress:8083","path":"/workouts/66/download","query":"","params":{"id":"66"},"route":"/workouts/:id/download","ip":"IpAddress","referer":"IpAddress:8083/workouts/66","length":0},"response":{"time":"2024-04-13T13:23:13.409449427+01:00","latency":7485492,"status":302,"length":0}}
{"time":"2024-04-13T13:23:13.533190114+01:00","level":"INFO","msg":"Incoming request","app":"workout-tracker","version":"master","sha":"e0a914e06295043ff333727a9780f262715fe778","module":"webserver","request":{"time":"2024-04-13T13:23:13.412059471+01:00","method":"GET","host":"IpAddress:8083","path":"/workouts","query":"","params":{},"route":"/workouts","ip":"IpAddress","referer":"IpAddress:8083/workouts/66","length":0},"response":{"time":"2024-04-13T13:23:13.533169064+01:00","latency":121109592,"status":200,"length":0}}
{"time":"2024-04-13T13:23:13.540818913+01:00","level":"INFO","msg":"Incoming request","app":"workout-tracker","version":"master","sha":"e0a914e06295043ff333727a9780f262715fe778","module":"webserver","request":{"time":"2024-04-13T13:23:13.540362231+01:00","method":"GET","host":"IpAddress:8083","path":"/assets/common.js","query":"","params":{"*":"/common.js"},"route":"/assets*","ip":"IpAddress","referer":"IpAddress:8083/workouts","length":0},"response":{"time":"2024-04-13T13:23:13.54081133+01:00","latency":449101,"status":200,"length":0}}
{"time":"2024-04-13T13:23:13.542237343+01:00","level":"INFO","msg":"Incoming request","app":"workout-tracker","version":"master","sha":"e0a914e06295043ff333727a9780f262715fe778","module":"webserver","request":{"time":"2024-04-13T13:23:13.540295663+01:00","method":"GET","host":"IpAddress:8083","path":"/assets/output.css","query":"","params":{"*":"/output.css"},"route":"/assets*","ip":"IpAddress","referer":"IpAddress:8083/workouts","length":0},"response":{"time":"2024-04-13T13:23:13.542213138+01:00","latency":1917476,"status":200,"length":0}}
{"time":"2024-04-13T13:23:13.542916617+01:00","level":"INFO","msg":"Incoming request","app":"workout-tracker","version":"master","sha":"e0a914e06295043ff333727a9780f262715fe778","module":"webserver","request":{"time":"2024-04-13T13:23:13.54044599+01:00","method":"GET","host":"IpAddress:8083","path":"/assets/dist/sorttable.js","query":"","params":{"*":"/dist/sorttable.js"},"route":"/assets*","ip":"IpAddress","referer":"IpAddress:8083/workouts","length":0},"response":{"time":"2024-04-13T13:23:13.542909427+01:00","latency":2463438,"status":200,"length":0}}
{"time":"2024-04-13T13:23:13.5436673+01:00","level":"INFO","msg":"Incoming request","app":"workout-tracker","version":"master","sha":"e0a914e06295043ff333727a9780f262715fe778","module":"webserver","request":{"time":"2024-04-13T13:23:13.539075891+01:00","method":"GET","host":"IpAddress:8083","path":"/assets/dist/fontawesome/css/all.min.css","query":"","params":{"*":"/dist/fontawesome/css/all.min.css"},"route":"/assets*","ip":"IpAddress","referer":"IpAddress:8083/workouts","length":0},"response":{"time":"2024-04-13T13:23:13.543660393+01:00","latency":4584501,"status":200,"length":0}}
{"time":"2024-04-13T13:23:13.669444496+01:00","level":"INFO","msg":"Incoming request","app":"workout-tracker","version":"master","sha":"e0a914e06295043ff333727a9780f262715fe778","module":"webserver","request":{"time":"2024-04-13T13:23:13.665640176+01:00","method":"GET","host":"IpAddress:8083","path":"/assets/dist/fontawesome/webfonts/fa-solid-900.woff2","query":"","params":{"*":"/dist/fontawesome/webfonts/fa-solid-900.woff2"},"route":"/assets*","ip":"IpAddress","referer":"IpAddress:8083/assets/dist/fontawesome/css/all.min.css","length":0},"response":{"time":"2024-04-13T13:23:13.669433112+01:00","latency":3792932,"status":200,"length":0}}
{"time":"2024-04-13T13:23:14.645143664+01:00","level":"INFO","msg":"Incoming request","app":"workout-tracker","version":"master","sha":"e0a914e06295043ff333727a9780f262715fe778","module":"webserver","request":{"time":"2024-04-13T13:23:14.642138501+01:00","method":"GET","host":"IpAddress:8083","path":"/assets/dist/fontawesome/webfonts/fa-brands-400.woff2","query":"","params":{"*":"/dist/fontawesome/webfonts/fa-brands-400.woff2"},"route":"/assets*","ip":"IpAddress","referer":"IpAddress:8083/assets/dist/fontawesome/css/all.min.css","length":0},"response":{"time":"2024-04-13T13:23:14.645131688+01:00","latency":2993186,"status":200,"length":0}}

Support for ulogger

I am running the ulogger server ATM with the android client. Would be great if workout tracker could fetch the gpx files automatically. Ui is looking great so far! I'll give the app a try asap.

Time discrepancy

I have noticed a time discrepancy between the Workouts Sumary page and the timeline on the individual Workout page.

The "an hour ago" is correct. But the displayed time should be 16:18

image

Detailed Workout page
image

Timeline is correct
image

Just for info the Walk started 16:18 and current time as posting is 17:58

Support Photos

It would be fantastic if we could upload photos that were taken on our hikes and them be displayed on the map. I use another service called RideWithGPS which does this so I've attached a screenshot to show what I mean.

image

Thanks again for this wonderful project it's amazing that you are so responsive. Do you have a way to donate?

Excessive scaling on "Time paused"

Total duration for Walking and Running activities only goes down to whole seconds, but Time paused goes down to millionths of a second.

I don't think that resolution for Time paused is required for either activity.
Perhaps Running or Sprinting will require Total duration to be in 10ths or 100ths of a second?

image

[Feature Request] Accept FitoTrack HTTP POST

FitoTrack has the ability to automatically export a GPX workout at the end of the workout and send it to a server.

Would it be possible to accept these requests?
I have my Workout-Tracker behind a Nginx proxy so I can securely expose Workout-Tracker to the outside world.

I think this would be a cleaner solution than exporting to a folder and then having an additional app running to export it to the server. You wouldn't need something running on the server to except file uploads either.

Add Translations for German

So far there is only english and dutch.
It would be great if there was also a choice of German as a translation.

If you want, I can also do this.

Strava API Integration

Would be awesome to be able to connect to the Strava API to sync my workouts from there. Other workout apps would be awesome too. Loving the project so far!

Wishlist: Automatic gpx import

I sync GPX files from fitotrack to my server. I would love to drop them into a directory and have them automatically import into workout-tracker.

It might be less work overall to write a crontask to curl the GPX files to the workouts endpoint, provided I can get the auth sorted out.

In any case: Love this project! I just imported 401 workouts into my instance in one go. It took a few minutes but worked perfectly. Thanks hugely!

Error processing .fit file

Hi, thank you for developing this project! I am trying out the project with podman on my local machine, and there seems to be an error processing a .fit file generated using a Wahoo Element Bolt bike computer.

version: v0.13.0
The following error is seen on the page:
image

The console log follows:

{"time":"2024-04-14T19:25:40.367276288Z","level":"ERROR","msg":"sql: converting argument $5 type: json: unsupported value: NaN","app":"workout-tracker","version":"master","sha":"1131e68d8a262f85731b2a661f5a6af1897aa8af","module":"database","error":"sql: converting argument $5 type: json: unsupported value: NaN","query":"INSERT INTO `map_data_details` (`created_at`,`updated_at`,`deleted_at`,`map_data_id`,`points`) VALUES (\"2024-04-14 19:25:40.366\",\"2024-04-14 19:25:40.366\",NULL,1,\"\") ON CONFLICT (`id`) DO UPDATE SET `map_data_id`=`excluded`.`map_data_id` RETURNING `id`","duration":117335,"rows":0,"file":"/app/pkg/database/workouts.go:197"}
{"time":"2024-04-14T19:25:40.367474547Z","level":"ERROR","msg":"sql: converting argument $5 type: json: unsupported value: NaN","app":"workout-tracker","version":"master","sha":"1131e68d8a262f85731b2a661f5a6af1897aa8af","module":"database","error":"sql: converting argument $5 type: json: unsupported value: NaN","query":"INSERT INTO `map_data` (`created_at`,`updated_at`,`deleted_at`,`workout_id`,`creator`,`name`,`center`,`address`,`total_distance`,`total_duration`,`max_speed`,`pause_duration`,`min_elevation`,`max_elevation`,`total_up`,`total_down`,`points`) VALUES (\"2024-04-14 19:25:40.366\",\"2024-04-14 19:25:40.366\",NULL,1,\"Garmin Connect\",\"\",\"{\"\"Lat\"\":47.45598521556553,\"\"Lng\"\":8.797513872274084}\",\"{\"\"FormattedAddress\"\":\"\"Burgstrasse, Rutzen, Rikon, Zell (ZH), Bezirk Winterthur, Zürich, 8486, Schweiz/Suisse/Svizzera/Svizra\"\",\"\"Street\"\":\"\"Burgstrasse\"\",\"\"HouseNumber\"\":\"\"\"\",\"\"Suburb\"\":\"\"\"\",\"\"Postcode\"\":\"\"8486\"\",\"\"State\"\":\"\"Zürich\"\",\"\"StateCode\"\":\"\"\"\",\"\"StateDistrict\"\":\"\"\"\",\"\"County\"\":\"\"\"\",\"\"Country\"\":\"\"Schweiz/Suisse/Svizzera/Svizra\"\",\"\"CountryCode\"\":\"\"CH\"\",\"\"City\"\":\"\"Rikon\"\"}\",0,6524000000000,0,776000000776,0,0,355.1200000000007,0,NULL) ON CONFLICT (`id`) DO UPDATE SET `workout_id`=`excluded`.`workout_id` RETURNING `id`","duration":1315417,"rows":1,"file":"/app/pkg/database/workouts.go:197"}
{"time":"2024-04-14T19:25:40.368148467Z","level":"ERROR","msg":"sql: converting argument $5 type: json: unsupported value: NaN; sql: converting argument $5 type: json: unsupported value: NaN","app":"workout-tracker","version":"master","sha":"1131e68d8a262f85731b2a661f5a6af1897aa8af","module":"database","error":"sql: converting argument $5 type: json: unsupported value: NaN; sql: converting argument $5 type: json: unsupported value: NaN","query":"INSERT INTO `workouts` (`created_at`,`updated_at`,`deleted_at`,`name`,`date`,`user_id`,`dirty`,`notes`,`type`,`data`,`gpx_data`,`filename`) VALUES (\"2024-04-14 19:25:40.364\",\"2024-04-14 19:25:40.364\",NULL,\"\",\"2024-04-12 14:21:29\",1,false,\"\",\"cycling\",NULL,\"\",\"\") RETURNING `id`,`checksum`","duration":5123591,"rows":1,"file":"/app/pkg/database/workouts.go:197"}

I would happily provide you with the file privately via Email if you decide to tackle the issue, since I don't want to reveal my location. Thanks!

[Feature Request] Move some Docker Variables to Admin Page

Would it be possible to move the following to the admin page?
WT_REGISTRATION_DISABLED="false"
WT_SOCIALS_DISABLED="false"

This would save having to restart the Docker container.

It might also be worth having an option for each user if WT_SOCIALS_DISABLED is false globally, they can still disable if they wish.

This way the admin can determine if socials are allowed or not at a server level.
If socials are allowed, then a user can still remove the option to do so if they wish.

Error importing FIT file for a swim

Tried to import a swimming file and got the error “ Encountered 1 problems while adding workouts: sql: converting argument $10 type: json: unsupported value: NaN”
Can you please help?

Add option to read time from filename

Hey, first of all very nice project! I was excited to try it, exported my activities from Strava, and promptly noticed I had a suspicious number of activities listed today. It seems like it only looks at the file modified (or created?) date, and not at the file titles. I think it might be useful to also look at file names, since exported data will often have incorrect modified dates.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.