Faits : A. Par jugement du 29 octobre 2014, statuant sur l'appel de X._ et l'appel joint du Ministère public dirigés contre un jugement du Juge de police de l'arrondissement de la Sarine du 3 février 2014 (consécutif à opposition à une ordonnance pénale du 26 février 2013), la Cour d'appel pénal du Tribunal cantonal du canton de Fribourg a rejeté l'appel et admis l'appel joint. X._ a été condamné à une peine de 180 jours-amende à 20 fr., avec sursis pendant 2 ans ainsi qu'à une amende de 400 fr. (peine de substitution de 4 jours de privation de liberté). En substance, ce jugement repose sur les faits suivants. Le 1 er septembre 2012 vers 22 heures, A.A._ a téléphoné à la centrale d'engagement de la gendarmerie pour expliquer qu'il venait d'être impliqué dans un accident de la circulation à la route xxx, à U._. Il a indiqué qu'un véhicule Peugeot immatriculé yyy l'avait dépassé à vive allure en haut de la route xxx et avait heurté l'angle avant gauche de sa voiture en se rabattant. Ce véhicule s'était ensuite déporté à droite, puis à gauche, avant de se retrouver sur la voie de circulation opposée, forçant les voitures arrivant en sens inverse à freiner. Malgré les appels de phare, il avait continué sa route. Alors que A.A._ avait stoppé sa voiture à un arrêt de bus pour constater les dégâts, le véhicule Peugeot était repassé à côté de lui à vive allure en direction de V._. X._ a été identifié comme le détenteur d'une voiture Peugeot zzz immatriculée yyy. La Cour d'appel pénal a retenu que celui-ci s'était rendu coupable de violation grave des règles de la circulation routière, d'entrave aux mesures de constatation de l'incapacité de conduire (véhicule automobile) et de violation des obligations en cas d'accident. B. X._ recourt au Tribunal fédéral contre cet arrêt. Il conclut, avec suite de dépens, à son acquittement. Il sollicite par ailleurs le bénéfice de l'assistance judiciaire.