Faits : A. Z._ est une association dont les objectifs sont notamment d'accueillir, d'aider, de conseiller et de soutenir ceux qui viennent le consulter et qui éprouvent des difficultés d'ordre social, spirituel, psychique, relationnel, juridique, matériel ou liées à l'invalidité. Par contrat de travail du 22 juin 2012, Z._ a engagé X._ en qualité de responsable de W._, entité active dans le ramassage et la vente d'objets d'occasion; le salaire mensuel brut était de 7'165 fr.40. Les tâches de l'employé portaient sur l'organisation et la coordination de W._ et des boutiques, l'organisation et la conduite des collaborateurs, la participation à l'élaboration des objectifs du secteur ainsi que la coordination et l'organisation des postes de service. X._ était également responsable de l'entretien et de l'aménagement des locaux et du matériel; avec une autre employée, il avait la charge du contrôle des caisses, des recettes, des dépenses et des factures. Selon un accord oral, le responsable de W._ pouvait ordonner des dépenses pour les petits travaux d'entretien d'un montant inférieur à 2'000 fr. En janvier 2014, X._ a mandaté une entreprise afin de retracer les places de parking extérieures de W._. L'entreprise a proposé de tracer une partie des places pour le prix de 500 fr. Le 21 janvier 2014, elle a établi une quittance pour le travail effectué et le montant précité. X._ a ensuite confié le reste du traçage à la même entreprise, qui a formulé oralement une offre portant sur un montant supplémentaire de 700 fr. A la fin des travaux, X._ a ajouté ce montant sur la quittance du 21 janvier 2014, au motif que l'entreprise n'était plus en possession de la seconde facture. La sortie de caisse correspondante a été enregistrée et déclarée à la comptabilité. Une semaine plus tard, A._, responsable "Administration et Finances" au sein de Z._, a invité X._ à produire une facture en bonne et due forme pour la seconde étape des travaux, car il ne pouvait enregistrer en l'état la quittance fournie. Comme les démarches entreprises par X._ pour joindre l'entreprise n'ont pas abouti, A._ a accepté, à titre exceptionnel, de valider la quittance et de l'enregistrer en tant que pièce comptable pour deux sorties de caisse, bien que cette façon de procéder fût contraire aux "Règles en matière de gestion de caisse au Z._". Début 2014, X._ cherchait à louer un appartement. Il a alors demandé à A._ s'il était possible d'obtenir de l'employeur une attestation de salaire ne mentionnant pas la saisie de salaire dont il faisait l'objet. Le responsable financier lui a répondu négativement, les seules possibilités étant la remise de la copie intégrale des fiches de salaire (faisant apparaître les saisies) ou l'établissement d'une attestation d'emploi avec indication du salaire contractuel. Devant ce refus, X._ a confectionné lui-même une attestation de salaire au nom de Z._, sans mention de la saisie, afin d'obtenir le bail de l'appartement qu'il convoitait. Par courrier du 17 février 2014, B._, directrice de Z._, a reproché à X._ d'avoir outrepassé ses fonctions en plusieurs occasions, s'attribuant des compétences de la responsable des ressources humaines, de la responsable de la communication ou de la directrice. Afin d'évoquer ces problèmes, une rencontre a été fixée au 24 février 2014. Ce jour-là, quelques heures avant l'entretien avec X._, B._ a reçu des collaborateurs souhaitant faire part du malaise qu'ils ressentaient envers le comportement du responsable de W._. A cette occasion, la directrice a appris que X._ avait raconté sur son lieu de travail qu'il avait établi une fausse attestation de salaire, destinée au propriétaire de l'appartement qu'il louait depuis peu; elle a également pris connaissance du retrait de caisse non conforme aux règles comptables de Z._. Lors de la rencontre avec la directrice, en présence de la responsable des ressources humaines, X._ a refusé de s'exprimer sur la fausse attestation de salaire. Par lettre remise le jour même à l'employé, B._ a mis fin sur-le-champ aux rapports de travail; elle y justifiait le licenciement immédiat par les deux faits précités dont elle venait de prendre connaissance. B. Par demande du 15 octobre 2014, X._ a ouvert action contre Z._. Il concluait au paiement des montants suivants: - 11'485 fr.80, sous déduction des charges légales et conventionnelles, avec intérêts, à titre d'indemnité correspondant au salaire dû pendant le délai de congé; - 2'625 fr.60, sous déduction des charges légales et conventionnelles, avec intérêts, à titre d'indemnité afférente aux vacances pendant le délai de congé; - 14'657 fr.20 avec intérêts, en indemnisation du licenciement injustifié et du tort moral. Z._ a conclu au rejet de la demande. Par jugement du 18 mars 2015, le Tribunal de prud'hommes de l'arrondissement de Lausanne a rejeté les conclusions prises par le travailleur. Statuant le 18 août 2015 sur appel de X._, la Cour d'appel civile du Tribunal cantonal du canton de Vaud a confirmé le jugement de première instance. C. X._ interjette un recours en matière civile. A titre principal, il reprend les conclusions de la demande. Il conclut subsidiairement au renvoi de la cause à la cour cantonale. Z._ propose le rejet du recours. Pour sa part, la cour cantonale se réfère aux considérants de sa décision.