Code Monkey home page Code Monkey logo

travelynx's Introduction

travelynx - Railway Travel Logger

travelynx allows checking into and out of individual trains, thus providing a log of your railway journeys annotated with real-time delays and service messages. It supports german railways and trains exposed by the Deutsche Bahn IRIS Interface as well as local transit and some trains outside of germany exposed by the Deutsche Bahn HAFAS Interface.

You can use the public instance on travelynx.de or host your own. See the Installation and Setup notes below.

Dependencies

  • perl ≥ 5.20
  • carton
  • build-essential
  • libpq-dev
  • git

Installation

travelynx depends on a set of Perl modules which are documented in cpanfile. After installing the dependencies mentioned above, you can use carton to install Perl depenencies locally. You may alsobe able to use cpanminus; however this method is untested.

In the project root directory (where cpanfile resides), run

carton install --deployment

and set PERL5LIB=.../local/lib/perl5 before executing any travelynx commands (see configs in the examples directory) or wrap them with carton exec, e.g. carton exec hypnotoad index.pl

Setup

First, you need to set up a PostgreSQL database so that travelynx can store user accounts and journeys. It must be at least version 9.4 and must use a UTF-8 locale. The following steps describe setup on a Debian 9 system; setup on other distributions should be similar.

  • Write down a strong random password
  • Create a postgres user for travelynx: sudo -u postgres createuser -P travelynx (enter password when prompted)
  • Create the database: sudo -u postgres createdb -O travelynx travelynx
  • Copy examples/travelynx.conf to the application root directory (the one in which index.pl resides) and edit it. Make sure to configure db, cache, mail, and secrets.
  • Initialize the database: carton exec perl index.pl database migrate or PERL5LIB=local/lib/perl5 perl index.pl database migrate

Your server also needs to be able to send mail. Set up your MTA of choice and make sure that the sendmail binary can be used for outgoing mails. Mail reception on the server is not required.

Finally, configure the web service:

  • Set up a travelynx service using the service supervisor of your choice (see examples/travelynx.service for a systemd unit file)
  • Configure your web server to reverse-provy requests to the travelynx instance. See examples/nginx-site for an nginx config.
  • Install a timeout 5m perl index.pl work -m production cronjob. It is used to update realtime data and perform automatic checkout and should run every three minutes or so, see examples/cron.

You can now start the travelynx service, navigate to the website and register your first account. There is no admin account, all management is performed via cron or (in non-standard cases) on the command line.

Please open an issue on https://github.com/derf/travelynx/issues or send a mail to [email protected] if there is anything missing or ambiguous in this setup manual.

Updating

It is recommended to run travelynx directly from the git repository. When updating, the workflow depends on whether schema updates need to be applied or not.

git pull
carton install --deployment # if you are using carton: update dependencies
chmod -R a+rX . # only needed if travelynx is running under a different user
if perl index.pl database has-current-schema; then
    systemctl reload travelynx
else
    systemctl stop travelynx
    perl index.pl database migrate
    systemctl start travelynx
fi

Note that this is subject to change -- the application may perform schema updates automatically in the future. If you used carton for installation, use carton exec perl ... in the snippet above; otherwise, export PERL5LIB=.../local/lib/perl5.

Setup with Docker

Note that travelynx Docker support is experimental and, in its current form, far from best practices. Pull requests are appreciated.

First, you need to set up a PostgreSQL database so that travelynx can store user accounts and journeys. It must be at least version 9.4 and must use a UTF-8 locale. See above (or examples/docker/postgres-init.sh) for database initialization. You do not need to perform the database migrate step.

Next, you need to prepare three files that will be mounted into the travelynx container: travelynx configuration, e-mail configuration, and imprint and privacy policy. For the sake of this readme, we assume that you are using the local/ directory to store these

  • mkdir local
  • copy examples/travelynx.conf to local/travelynx.conf and configure it.
  • copy examples/docker/email-transport.sh to local/email-transport.sh and configure it. The travelynx container does not contain a mail server, so it needs a separate SMTP server to send mail. It does not receive mail.
  • create local/imprint.html.ep and enter imprint as well as privacy policy data.
  • Configure your web server to reverse-provy requests to the travelynx instance. See examples/nginx-site for an nginx config.

travelynx consists of two runtimes: the web application and a background worker. Your service supervisor (or docker compose / docker stack / kubernetes setup) should orchestrate them somewhere along these lines.

  • docker pull derfnull/travelynx:latest
  • Start web application: docker run -p 8093:8093 -v ${PWD}/local:/local:ro travelynx:latest
  • Wait until localhost:8093 responds to requests
  • Start worker: docker run -v ${PWD}/local:/local:ro travelynx:latest worker

To install an update: stop worker and web application, update the travelynx image, and start them again. Database migrations will be performed automatically. Note that downgrades are not supported.

Usage

For the sake of this manual, we will assume your travelynx instance is running on travelynx.de

travelynx journey logging is based on checkin and checkout actions: You check into a train when boarding it, select a destination, and are automatically checked out when you arrive. Real-time data is saved on both occasions and continuously updated while in transit, providing an accurate overview of both scheduled and actual journey times.

Checking in

You can check into a train up to 30 minutes before its scheduled departure and up to two hours after its actual departure (including delays).

First, you need to select the station you want to check in from. Navigate to travelynx.de or click/tap on the travelynx text in the navigation bar. You will see a list of the five stations closest to your current location (as reported by your browser). Select the station you're at or enter its name or DS100 code manually.

As soon as you select a train, you will be checked in and travelynx will switch to the journey / checkout view. If you already know where you're headed, you should click/tap on the destination station in the station list now. You can change the destination by selecting a new one anytime.

Checking out

You are automatically checked out a few minutes after arrival at your destination. If the train has already arrived when you select a destination and its arrival was less than two hours ago, you are checked out immediately. If it's more than two hours, you need to perform a manual checkout (without arrival data) using the link at the bottom of the checkin menu's station list.

Testing

The test scripts assume that travelynx.conf contains a valid database connection. They will create a test-specific schema, perform all operations in it, and then drop the schema. As such, the database specified in the config is not affected.

Nevertheless, bugs may happen. Do NOT run tests on your production database. Please use a separate development database instead.

Run the tests by executing prove. Use prove -v for debug output and DBI_TRACE=SQL prove -v to monitor SQL queries.

Licensing

The copyright of individual files is documented in the file's header or in .reuse/dep5. The referenced licenses are stored in the LICENSES directory.

The program code of travelynx is licensed under the terms of the GNU AGPL v3. HTML Templates and SASS/CSS layout are licensed under the terms of the MIT License. This means that you are free to host your own travelynx instance, both for personal/internal and public use, under the following conditions.

  • You are free to change HTML/SASS/CSS templates as you see fit (though you must not remove the copyright headers).
  • If you make changes to the program code, that is, a file below lib/ or a travelynx javascript file below public/static/js/, you must make those changes available to the public.

The easiest way of making changes available is by maintaining a public fork of the Git repository. A tarball is also acceptable. Please change the source ref in travelynx.conf if you are using a fork with custom changes.

References

Mirrors of the travelynx repository are maintained at the following locations:

travelynx's People

Contributors

clonejo avatar deingithub avatar derf avatar feuerrot avatar knuspel avatar ljrk0 avatar lollar1337 avatar marudor avatar mq89 avatar mrkriskrisu avatar networkexception avatar sp8c3 avatar sysvinit 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

travelynx's Issues

Traewelling-Verknüpfung: Error 500

Traewelling ist mit einem Error 500 nicht erreichbar. Beim Versuch, das Problem durch Abmelden und wieder Anmelden zu beheben, scheitert auch die Anmeldung bei Traewelling über die Schnittstelle ;-)

Checkin in via API results in HTTP 500

Checking in via the API reproducibly throws HTTP 500 errors for me.

curl command used:

curl -v https://travelynx.de/api/v1/travel -H 'content-type: application/json' -d '{"token":"REDACTED","action":"checkin","fromStation":"8000105","toStation":"8070003","train":{"type":"ICE","no":"771"},"comment":"test"}'

From the resulting HTML:

Timestamp:
05/Sep/2020:19:11:03 +0200
	
Message:
Can't locate object method "get_departures" via package "Travelynx::Controller::Api" at lib/Travelynx/Controller/Api.pm line 226.

Include recent departures in frequent connections

I think it would be convenient to include recent departures in the proposed frequent connections ("Häufig genutzte Verbindungen"). Say, the trains that departed 5 to 10 minutes to go.

I often check in a train once I have found a seat, i.e. after it departed. But at this point, my train does not appear on the proposed list anymore. The list however already shows the next train and I need to scroll down in the list of trains until I find — Anfragezeitpunkt — because my train is just below it.

API Endpunkt für Reisen in einem gegebenen Zeitraum

Es wäre schön einen API-Endpunkt zu haben, der alle Reisen in einem gegeben Zeitraum zurück gibt, bzw. mit dem passenden Parameter, alle Reisen. Der Inhalt könnte grob so aussehen, wie das Objekt "journeys" in der export.json, erweitert um eine eineindeutige ID um die Reise klar identifizieren zu können.

Beispiel:
https://travelynx.de/api/v1/journeys?sdate=1672527600&edate=1677625199
gibt alle Reisen zwischen dem 2023-01-01T00:00:00 und dem 2023-02-28T23:59:59 zurück.

Enhancement: Lowercase DS100

When entering DS100 on the main page to check-in on a train it only works when entering the DS100 in upper case letters. So "KAW" works for Aachen West but "kaw" does not work.
Since every DS100 is written in upper case there should not be any conflicts when also accepting them in lower case.

Kurzfristiger Zugausfall am Startbahnhof wird nicht erkannt

Wenn ein Zug kurzfristig (d.h. erst nach dem Checkin) am Startbahnhof ausfällt, verfährt travelynx weiter so, als würde die geplante Abfahrt stattfinden. Stattdessen sollte ein Zugausfall vermerkt und der Checkin rückgängig gemacht werden.

Workaround: Checkin rückgängig machen und erneut einchecken (-> Zugausfall wird geloggt)

Enhancement: Karte der History

Ich fände ein Feature cool worin die History auch auf einer Karte abgebildet wird.
Die Daten hierfür gibt es bei OSM.
Ein solches Tool konnte ich bisher nicht finden und würde die hier gesammelten Daten gut ergänzen.

Checkout when you change trains buggy

Stations that have multiple areas (for instance Frankfurt Hbf and Frankfurt Hbf (Tief) or Berlin Hbf (Tief), Berlin Hbf and Berlin Hbf (S-Bahn)) are a problem for the checkout when you change trains.

As you only do the auto checkout 10 minutes after arrival I'm often still checked in when I check into the new train. Doing that will check me out at the new Station, not at the arrived station.
This will result in logs that tell me I travelled from Karlsruhe Hbf to Frankfurt Hbf (Tief) (not possible)

Screenshot 2019-12-23 at 10 05 48

Screenshot 2019-12-23 at 10 06 07

This most likely results in broken statistics & broken data for the map? (The connection Frankfurt Hbf -> Berlin Hbf is missing on the map)
It will also result in broken details for this connection. It can not correctly map where I left.
Screenshot 2019-12-23 at 10 07 07

Suggestion:
Use the meta station data to map the data. And use a station that is on the via of a train for the checkout.

Sharing on devices without Web Share API

At the moment, the Share button links to the status page on devices which do not support the Web Share API. Offering to copy the status text to the clipboard instead would be useful.

Enhancement: Migrate to PWA

It would greatly improve mobile experience if travelynx would support some parts of a progressive web app.
E.g. travelynx could then be launched from the home screen of Android like a real app.

Get polyline after the trip to take divertions into account

When a train is diverted (My example was an ICE yesterday diverted from KRM to the rhine route), the polyline provided by HAFAS sometimes also changes.
It seems like the polyline is fetched by travelynx and the start of the journey. I think it would be better to fetch it at the end to have a better chance that it's right.
(Unfortunately my perl knowledge is really bad, otherwise I would have done it myself)

Do not ask for geolocation right away

It's considered quite rude to instantly ask for geo location.
Rather ask once the user wants to use a feature that needs it. That way it's way more obvious why you want/need it.

Also for user like me who do not use that feature at all it's just annoying.

Possible bug and missed opportunities on polylines

Currently, the maintenance script will check only the journey's route to see if there's a match and, if so, use that polyline.

This leads to some missed opportunities and some possible errors:

  1. Journeys that are "entered" directly through travelynx will contain the full route, including stops before and after the departure station and arrival station. The route A-B-C-D-E, where one starts at A and ends at C, will have the same polyline than another journey with that same route but different start and endpoints - e.g. C and E.
    Of course, this will only be true for all journeys that don't have a polyline yet, but nevertheless.

  2. Checking only the complete journey will lead to missed opportunities, since (afaik) it's not possible to enter the whole route when manually entering a journey, because travelynx will add the departure and arrival station manually at both ends if it can't find it there, even though they are appearent on the route. Further, the new import API doesn't allow stops before or after checkin/checkout.
    And lastly, some really just enter the stops inbetween.

So, maybe it would be better to check if checkin and checkout match against the database and then "manually" check the journey in the code?

Anyway, thank you for this. I love using travelynx and find it already so much better than träwelling :)

Account deletion reminder

Travelynx automatically deletes accounts which were not active (i.e., not logged in) for more than one year. There are cases (such as SARS-CoV-2 pandemics) where this may cause unwanted account deletions. Sending out an e-mail reminder a few weeks prior to account deletion should alleviate that.

Line is missing stops

This issue is regarding the S3 from the HVV, but might be a problem for other lines too.

When I select a starting point from Buxtehude and I want to use the S3 to Pinneberg, I only get the first 3 stops to Hamburg-Neugraben. This issue is happening from every starting point from Stade to Neugraben. This might be because at Neugraben another train is coupled with the exist one to increase the size. Träwelling does not have this issue, so maybe you could check their Github.

https://www.nimmbus.de/fahrplanbuch/plaene/S3H-1.htm

Fernverkehrslinien mit aufzeichnen

Es wäre schön, wenn auch zu Fernverkehrszügen die Liniennummer gespeichert werden würde, da dies aus meiner Sicht die Auswertungen sinnvoller machen würde.

Mindestens bei Marudor sollte diese auch verfügbar sein.

Downloading Passenger rights results in HTTP 500

Clicking on the download button for passenger rights results in 500 Internal Server Error for me.

Timestamp: 09/Sep/2020:19:03:25 +0200 
 
Message: Can't locate object method "journey" via package "Travelynx::Controller::Passengerrights" at lib/Travelynx/Controller/Passengerrights.pm line 196.

Enhancement: Add trip categories to checkin

Hi,

a very useful feature would be to have not only comments to check ins, but having some enums to select from,
like "private", "business", "chaos-originated travel".

Some heavy duty users need to log their journeys for the wonderful friends at the Finanzaemter, and having that option in checkin and in the export would be really really cool. :3

Distance on month/year summary doesn't equal the sum of the journey distances

For some reason there is a rather large mismatch between single-journey distances added together and the displayed total distance of a month/year. For example, in the month 03/2020 it displays 598km, and adding the displayed distances together results in 675 km. That's a pretty large mismatch, and I think that's unintended behavior.

Enhancement: Mark a journey/train as cancelled

I checked into a train from Frankfurt (Main) Hbf to Nürnberg Hbf and after checking in, the train got redirected to Frankfurt (Main) Südbahnhof, so for me, the whole train got cancelled (as I couldn't make it in time to Südbahnhof.

Unfortunately, Travelynx didn't handle this, keeping me checked in (with no real time data at Frankfurt (Main) Hbf, but with real time data from Nürnberg Hbf). So since I checked in to the next train, I get a warning in the statistics that my data are inconsistent as I've been checked into two trains at the same time.

I want to keep the entry to track its cancelled state, so I want to ask if it's possible to get the checkbox for a cancelled train also on checked-in trains (as it's currently only available for manual entries).
Or is it some other bug I ran into?

Bug: Validation failed for type named Num declared in package Specio::Library::Builtins

Timestamp: 06/Oct/2019:00:36:48 +0200

Message: Validation failed for type named Num declared in package Specio::Library::Builtins (/srv/www/travelynx/local/lib/perl5/Specio/Library/Builtins.pm) at line 139 in sub named (eval) with value DateTime={ formatter: undef, local_c: { day: 6, day_of_quarter: 6, day_of_week: 7, day_of_year: 2...


User: Twi

The error message occurs as soon as I try to open Travelynx via https://travelynx.de/. So Travelynx is currently unusable for me.

Before the error occured, I tried to re-check in into ICE 619 (Frankfurt Flughafen Fernbf to Karlsruhe), after I already checked in and checked out of the train approx 0:45h before (Montabaur to Frankfurt Flughafen Fernbf).

This train has two stops at the same station at two different times and the first stop doesn't have a departure time in RIS:
image

Maybe it is related to this special use case.

I already tried to delete the first check-in, but this didn't resolve the problem.

Möglichkeit Zugfahrten aus der Vergangenheit hinzuzufügen mit akkuraten Daten und genauer Fahrstrecke?

Wenn man einchecken will zeigt Travelynx abfahrende Züge vom Bahnhof bishin zu 2 Stunden in die Vergangenheit an, man kann jedoch bei der DB Navigator App auch Zugfahrten mehrere Monate aus der Vergangenheit finden! Ich weiß nicht wie die DB API funktioniert oder ob diese soetwas zulässt, doch es wäre schön in der Lage zu sein Zugfahrten aus mehreren Monaten oder sogar Jahren aus der Vergangenheit hinzuzufügen!

Ich könnte mir vorstellen unter den vorgeschlagenen Abfahrten einen Knopf zu haben der sagt „Frühere Abfahrten anzeigen” ggf. mit der Option ein spezifisches Datum einzugeben und von dem Tag die Abfahrten anzeigen zu lassen.

Ich habe z.B. gestern vergessen mich für die Fahrt vom Hannover Hbf nach Norden einzutragen, das Beste was Ich jetzt tun kann ist diese Strecke manuell einzutragen wodurch mir aber nur eine Luftlinie und inakkurate Streckendaten gegeben wird.

Vor allem für Menschen wie mich welche Aufzeichnungen wenden per Hand oder via Rail Planner / Discover EU haben wäre dieses Feature hilfreich um nicht nur eine akkurate Strecke anzuzeigen sondern auch genaue Daten über seine Reisen zu sammeln.

Ich weiß, dass auch die DB Navigator App nachdem die Fahrt vorbei ist Verspätungen etc. nicht mehr anzeigt, somit müsste man dort auf seinen eigenen Aufzeichnungen beruhen!

Alternativ hatte Ich mir noch vorgestellt könnte man beim manuellen hinzufügen auch sowas wie die Strecke und hindurchgefahrenden Orte von der API fetchen. Die Strecke ist meist die selbe nur eben zu einem anderen Zeitpunkt! Der Nutzer könnte gefragt werden „ist dies vergleichbar mit Fahrt von XXX zu XXX” und die Daten der Fahrt könnten übertragen werden doch die Nutzer definierten Zeitpunkte usw. bleiben bestehen. Dies wäre vor allem gut um am Ende nicht nur Luftlinien zwischen Städten zu haben, sondern eine Aufzeichnung des Schienennetzes welches man verwendet hat!

Ein mögliches Workaround wäre einfach jetzt zu sagen das Ich die Strecke vom Hannover Hbf nach Norden fahre und diesen Eintrag im Nachhinein editiere mit den akkuraten Zeiten. Ich weiß noch nicht ob das dazu führen wird wegen der Fehlermeldung:

Nach einer Änderung können die ursprünglich eingetragenen Daten nicht wiederhergestellt werden.

Kann sein das die schöne, akkurate Strecke welche mein Zug gefahren ist ersetzt wird mit Luftlinien!

Edit: Das ist genau was passiert! Würde mir wünschen die Strecke übertragen zu können, da das Schienennetz sich meist nicht ändert und die Luftlinie einfach zu ungenau ist!

Vielen Dank für das Entwickeln von Travelynx! Ich kann verstehen wenn das Feature nicht implementiert wird da es extrem viel Aufwand kostet solche Dienste kostenlos zu betreiben, Ich liebe Travelynx weiterhin!

Ankunft in wird falsch berechnet

image

Wie hier zu sehen ist stimmt die relative Ankunft in Zeit nicht.
Die relative Ankunft referenziert die planankunft, nicht die Echtzeit Ankunft.
Es wird aber die korrekte absolute Ankunftszeit angezeigt.

Unable to open TOR.txt

When registering, I see this error which blocks registering new users:

Angaben für einen Bug-Report:
Timestamp: 25/Oct/2021:18:02:46 +0200
Message: cannot open(TOR.txt) at lib/Travelynx/Controller/Account.pm line 91.

Fehler Vils Stadt

Den Bahnhof Vils Stadt scheint es in der Anwendung nicht zu geben. Dadurch kommt es zu Fehlern wenn man diesen Bahnhof auswählen möchte.

500 Internal Server Error on search for Station

Timestamp: 26/Dec/2019:19:22:26 +0100

Message: Can't call method "epoch" on an undefined value at lib/Travelynx.pm line 2400.

Verified with stations "Mainz HBF" and "Frankfurt (Main) HBF"

Journey nicht richtig abgeschlossen/auf den nächsten Tag verteilt

Wir haben fast zeitgleich in den Zug eingecheckt und sind ans gleiche Ziel gefahren.
Am nächsten Tag hab ich dann beim check in in einen anderen Zug die "Inkonsistente Reisedaten" Meldung bekommen. Dabei ist aufgefallen das meine Reise irgendwie auf den nächsten Tag gerutscht ist, aber check in war korrekt am Tag vorher.
Konkret war die Startzeit/Checkin korrekt am 29. (Abfahrt in Düsseldorf)
Die Ankunft war dann am 30. (Ankunft in EDO/Dortmund)

Ich hab inzwischen die Daten manuell korrigiert, aber die HIM Meldung ist noch vom Tag drauf. Hoffe du kannst da noch was nachvollziehen.
Meine Reise: https://travelynx.de/p/marudor/j/324302
Refrenz: https://travelynx.de/p/Tonda/j/323723

Enhancement: Add possibility to mark delay as "useful"

Sometimes you are just able to catch a train due to it's delay and therefore the delay didn't impact you negatively.
It would be nice to mark the current delay as "neutral" in order to only count further delay towards the stats.

Map doesnt't draw lines reliably

  • The new map feature seems to not reliably draw the lines between stations yet.
    grafik
  • Additionally I'm curious if one could add the route of a train when manually adding a journey. That would make the map prettier but also provide more info about where one went.

Web hooks for event

Hi,

support for webhooks would be nice,
which are triggered by events, eg:

  • checkin
  • train departure
  • train arrival

I guess just POSTing to an URL with the content of https://travelynx.de/api/v1/status/ and having a bearer token for authentification would be sufficient.

Falsche HIM Meldung angezeigt

image
Der Fernverkehr sollte wohl keine HIM Meldung aus NRW haben.
Ich hab bei mir gegen gechecked ich zeig das nicht an, scheint also kein Fehler in den Quellen zu sein.

dbf zeigt die HIM Meldung auch nicht an.
image

Accessibility issues

Overall, there are a couple of accessibility issues with travelynx that should be rather trivial to fix. This issue was created during my initial exploration of the service using Android's Talkback screen reader and serves as a collection of my findings:

  • Buttons in the main navbar (the purple one) are not labelled accurately and their code identifiers are read aloud, e.g. invert_colors (including the underscore) when it should be just "Invert Colors". This can be circumvented by setting an additional aria-label attribute with a correct, localized description of the functionality. This extends to buttons with symbols where things like "comment Kommentar" are spoken aloud. To hide certain elements from a screenreader but still display them visually, set the aria-hidden="true" attribute.
  • Some buttons/links like "ZUGLAUF" (likely due to the capitalization) or double-digit carriage numbers are all spelled individually, e.g. "Z U G ..." or "one one" instead of "eleven"
  • Some buttons/links are redundant, e.g. one icon for sharing and a button to "Teilen" right next to it. See problems above. These should be combined to be a single element and the redundant information hidden away from the user.
  • Dropdowns (e.g. the station selector) are entirely inaccessible and thus it is mandatory to always write out the entire name of a station
  • The error text of textboxes is spoken immediately when they come in focus, even when nothing was entered yet

Thanks for the service! Looking forward to use it in the future! :)

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.