diff --git a/lib/Travelynx/Command/database.pm b/lib/Travelynx/Command/database.pm
index 6a85e69cc6cb8c0722598f4b31ee2616dc9a9668..485c920d3b21389525e7b1bf6f0b10f6cd587acc 100644
--- a/lib/Travelynx/Command/database.pm
+++ b/lib/Travelynx/Command/database.pm
@@ -1717,6 +1717,50 @@ my @migrations = (
 			}
 		);
 	},
+
+	# v41 -> v42
+	# adds current followee checkins
+	sub {
+		my ($db) = @_;
+		$db->query(
+			qq{
+				create view follows_in_transit as select
+					r1.subject_id as follower_id, user_id as followee_id,
+					users.name as followee_name,
+					train_type, train_line, train_no, train_id,
+					extract(epoch from checkin_time) as checkin_ts,
+					extract(epoch from sched_departure) as sched_dep_ts,
+					extract(epoch from real_departure) as real_dep_ts,
+					checkin_station_id as dep_eva,
+					dep_station.ds100 as dep_ds100,
+					dep_station.name as dep_name,
+					dep_station.lat as dep_lat,
+					dep_station.lon as dep_lon,
+					extract(epoch from checkout_time) as checkout_ts,
+					extract(epoch from sched_arrival) as sched_arr_ts,
+					extract(epoch from real_arrival) as real_arr_ts,
+					checkout_station_id as arr_eva,
+					arr_station.ds100 as arr_ds100,
+					arr_station.name as arr_name,
+					arr_station.lat as arr_lat,
+					arr_station.lon as arr_lon,
+					polyline_id,
+					polylines.polyline as polyline,
+					visibility,
+					coalesce(visibility, users.public_level & 127) as effective_visibility,
+					cancelled, route, messages, user_data,
+					dep_platform, arr_platform, data
+					from in_transit
+					left join polylines on polylines.id = polyline_id
+					left join users on users.id = user_id
+					left join relations as r1 on r1.predicate = 1 and r1.object_id = user_id
+					left join stations as dep_station on checkin_station_id = dep_station.eva
+					left join stations as arr_station on checkout_station_id = arr_station.eva
+					;
+				update schema_version set version = 42;
+		}
+		);
+	},
 );
 
 # TODO add 'hafas' column to in_transit (and maybe journeys? undo/redo needs something to work with...)
diff --git a/lib/Travelynx/Model/InTransit.pm b/lib/Travelynx/Model/InTransit.pm
index e36173d9f9b0df8837d776bae569ff84283d9dce..81d4a24ba2813e0f688c19e0e7f23bed36e411a2 100644
--- a/lib/Travelynx/Model/InTransit.pm
+++ b/lib/Travelynx/Model/InTransit.pm
@@ -154,6 +154,38 @@ sub get {
 	return $ret;
 }
 
+sub get_timeline {
+	my ( $self, %opt ) = @_;
+
+	my $uid = $opt{uid};
+	my $db  = $opt{db} // $self->{pg}->db;
+
+	my $where = {
+		follower_id          => $uid,
+		effective_visibility => { '>=', 30 }
+	};
+
+	if ( $opt{short} ) {
+		return $db->select(
+			'follows_in_transit',
+			[
+				qw(followee_name train_type train_line train_no dep_eva dep_name arr_eva arr_name)
+			],
+			$where
+		)->hashes->each;
+	}
+
+	my $res = $db->select( 'follows_in_transit', '*', $where );
+	my $ret;
+
+	if ( $opt{with_data} ) {
+		return $res->expand->hashes->each;
+	}
+	else {
+		return $res->hashes->each;
+	}
+}
+
 sub get_all_active {
 	my ( $self, %opt ) = @_;
 	my $db = $opt{db} // $self->{pg}->db;