Faits : A. B._ KG est une société en commandite de droit allemand ayant pour but la construction de maisons préfabriquées. Copropriétaire pour 1⁄2 d'une parcelle à Neuchâtel, A._ a fait parvenir à l'entreprise allemande les esquisses 3D - réalisées par lui-même - de la maison dont il souhaitait lui confier la construction. Le 14 décembre 2011, B._ KG a adressé à A._ un devis estimatif, basé sur les esquisses précitées. Le prix était fixé à 1'082'403 euros, avec une variation possible de l'ordre de 5%; il était précisé que "ce prix était un [p]ré calcul avant contrôle des plans par B._ KG, Allemagne", qu'il pouvait "subir des changements si les plans [étaient] modifiés après ce pré calcul ou s'ils d[evaient] être adaptés dû au contrôle statique ou au règlement communal" et qu'"un calcul des coûts précis sur la base des esquisses mises à [sa] disposition n'[était] pas possible". Le 29 janvier 2012, les parties ont signé un «formulaire de demande pour la conclusion d'un contrat d'entreprise». Les documents à la base du contrat sont notamment le «détail des prestations du 14 décembre 2011» et des conditions générales. Le § 9 ch. 3 des «modalités du contrat» figurant dans les conditions générales a la teneur suivante: " S i le contrat est achevé ou résilié conformément au § 9 alinéa 2 des conditions commerciales générales ou d'une autre manière sans que le constructeur ne soit en cause ou, si le maître d'ouvrage refuse l'exécution du contrat, alors le constructeur est autorisé à exiger des dédommagements pour non-exécution respectivement la rémunération qui lui revient conformément au § 649 alinéa 2 du Code civil allemand (BGB), sans autre preuve à hauteur de 8% du prix total, sauf si le maître prouve que le constructeur n'a pas subi aucun préjudice (sic) ou simplement un préjudice négligeable". Selon le § 10.4 des conditions générales, le contrat est soumis exclusivement au droit allemand. L'«annexe au contrat B._» comprend en outre une liste des étapes importantes du projet, soit: 1°) Avant-projet 2°) Offre 3°) Contrat avec B._ 4°) Contrat d'architecte 5°) Vérification des plans en Allemagne 6°) Mise à l'enquête 7°) Plans définitifs et procès-verbal pour le sous-sol 8°) Avenant de B._ 9°) Permis de construire, confirmation de financement 10°) Paiement de l'acompte de 10% à B._ 11°) Rendez-vous de chantier 12°) Échantillonnage en Allemagne 13°) Livraison du sous-sol -> livraison de la maison 14°) Remise des clefs par le chef de chantier de B._. Par courrier du 5 mars 2012, B._ KG a confirmé la commande, confirmation signée par A._. Ce dernier a mandaté U._, architecte habitué à travailler pour B._ KG, afin d'établir les «plans projets»et les plans d'exécution de la maison. Lors de la préparation du dossier pour la mise à l'enquête publique, plusieurs éléments ont été modifiés. A la suite de propositions de l'architecte, les parties ont notamment passé des accords adaptant le projet initial. Ainsi, dans une proposition datée du 4 mai 2012, l'architecte a demandé que les plans « Vorabzug 1b » soient modifiés; la proposition concernait principalement les fenêtres de la maison. A._ ne l'a pas signée, mais n'a pas manifesté de désaccord exprès auprès de B._ KG, ni présenté une contre-proposition. Selon B._ KG, ces changements étaient toutefois obligatoires, car dictés par des exigences statiques et techniques. Le 5 octobre 2012, A._ a signé les plans d'exécution ainsi que la «confirmation d'étude» que B._ KG lui avait soumise. Faute d'avoir réussi à s'entendre sur la réalisation de la terrasse, les parties ont convenu qu'elle serait effectuée en régie propre par A._. Par courrier du 20 décembre 2012, B._ KG a fait part à A._ d'une offre additionnelle, composée de plus-values et de moins-values, lesquelles ont porté le prix de la villa à 1'068'344.80 euros. Le même jour, le Conseil communal de la ville de Neuchâtel a accordé la sanction définitive aux plans et a accepté la modification du permis de construire. Dans plusieurs courriers, B._ KG a exigé le versement de l'acompte prévu dans le contrat. Pour sa part, A._ a demandé diverses précisions relativement aux niveaux 1 et 2 de la maison, déclarant qu'il s'acquitterait ensuite de l'acompte. Le 2 mai 2013, B._ KG a adressé à A._ un avenant au contrat, qui portait le prix à 1'333'518.82 euros, ainsi qu'un protocole d'échantillonnage. Par courrier du 30 juillet 2013, B._ KG a signifié à A._ l'impossibilité de terminer le projet s'il ne versait pas l'acompte convenu. Elle lui a rappelé les deux possibilités dont il disposait: verser l'acompte ou annuler le contrat. Par pli du 10 septembre 2013, A._ a "consenti à accepter" l'annulation du contrat, considérant que les parties étaient libres de tout engagement l'une envers l'autre. Par courrier du 18 septembre 2013, B._ KG a précisé qu'elle ne mettait pas fin au contrat, mais se trouvait dans l'impossibilité de l'exécuter en raison du comportement de A._. Ce dernier a maintenu sa position. Par courrier du 29 janvier 2014, B._ KG a rappelé à A._ que, conformément aux dispositions contractuelles, en particulier au § 9 ch. 3 des conditions générales, il était tenu, en cas d'annulation ou de résiliation, de s'acquitter d'un montant de 86'592.24 euros correspondant à 8% du prix prévu par le contrat du 29 janvier 2012. Elle a également requis le paiement de ses frais d'avocat selon le § 280 al. 1 du Code civil allemand (BGB). Les démarches de B._ KG sont restées vaines. B. Par demande du 27 novembre 2015, B._ KG a conclu à ce que A._ lui paie la somme de 86'592.24 euros, plus intérêts à 5% l'an dès le 7 février 2014, ainsi que le montant de 2'572 euros, à titre de frais d'avocat avant procès, plus intérêts au taux d'intérêt de base allemand, plus 5% l'an dès le 7 février 2014. A._ a conclu au rejet de la demande et, reconventionnellement, au paiement par B._ KG d'un montant de 157'135 fr.85 avec intérêts à 4% l'an dès le 28 août 2015, à titre de dommages-intérêts. Par jugement du 10 août 2018, le Tribunal civil du Littoral et du Val-de-Travers a rejeté la demande et la demande reconventionnelle. En substance, les premiers juges ont considéré que les parties avaient une conception opposée du projet, soit du rapport juridique de base, de sorte qu'en application du § 313 al. 2 et 3 BGB, le défendeur avait valablement résolu le contrat. Ils ont ensuite écarté la demande en paiement principale, au motif que B._ KG n'avait pas établi que les prestations qu'elle avait effectuées donnaient lieu à rémunération, le devis estimatif ne mentionnant au surplus aucune rétribution pour ces phases du projet. Enfin, ils ont rejeté toute prétention en dommages-intérêts, la résolution du contrat n'étant, selon eux, pas imputable à la faute de l'une ou l'autre des parties. Par arrêt du 19 février 2019, la Cour d'appel civile du canton de Neuchâtel a admis l'appel déposé par B._ KG et a réformé le jugement de première instance en ce sens que A._ est condamné à payer à B._ KG 85'467.60 euros, plus intérêts au taux de base allemand plus 5% l'an dès le 14 février 2014, ainsi que 2'572 euros, plus intérêts au taux de base allemand, plus 5% l'an dès le 14 février 2014. À l'inverse des premiers juges, la cour cantonale a considéré qu'aucun changement important et imprévisible ne rendait déraisonnable le maintien du rapport contractuel, la divergence de conception entre les parties ne concernant que des éléments relatifs au contenu du contrat et non à son fondement. En conséquence, le § 313 BGB ne pouvait justifier une résolution du contrat. La Cour d'appel civile a ensuite retenu que la demanderesse n'avait pas libéré le défendeur du régime conventionnel lorsqu'elle lui avait donné la possibilité de se départir du contrat et qu'ainsi, en vertu du § 9 ch. 3 des conditions générales, une indemnité forfaitaire correspondant à 8% du prix selon le contrat d'entreprise lui était due. Elle a considéré que la demanderesse n'avait pas adopté un comportement fautif, qui aurait justifié un droit de résiliation indépendant fondé sur le § 649 BGB. Enfin, elle a mis à la charge du défendeur le paiement des frais d'avocat avant procès engagés par la demanderesse en vertu du § 280 al. 1 BGB. C. A._ interjette un recours en matière civile. Il conclut principalement à ce que l'arrêt du 19 février 2019 soit réformé en ce sens qu'il n'est pas débiteur de B._ KG, le jugement du Tribunal civil du Littoral et du Val-de-Travers du 10 août 2018 étant confirmé. L'effet suspensif a été accordé au recours par ordonnance présidentielle du 12 avril 2019. L'intimée a conclu au rejet du recours. La Cour d'appel civile a renoncé à se déterminer.