Faits: A. Par contrat du 26 juin 2003, Y._ a remis à bail à X._ une maison mitoyenne sise à ...; le loyer mensuel était fixé à 3'150 fr., charges non comprises. Conclu pour une durée initiale de deux ans à partir du 1er juillet 2003, le bail se renouvelait ensuite tacitement d'année en année. Le 23 décembre 2005, la locataire a résilié le bail pour le 31 janvier 2006; elle s'engageait à présenter au plus vite une personne solvable disposée à reprendre le bail aux mêmes conditions. A la suite d'annonces que la locataire avait fait paraître, A._, B._ et C._ ont visité la maison; elle ont souhaité la louer ensemble, ce que leurs revenus mensuels cumulés de 15'000 fr. leur permettaient. Le 10 février 2006, X._ a informé la gérance qu'en raison du refus de la candidature conjointe de A._, B._ et C._, elle était déliée de ses obligations, de sorte que le bail était réputé résilié au 15 février 2006. Le 16 février 2006, la régie a rappelé à la locataire que la prochaine échéance contractuelle du bail correspondait au 30 juin 2006; elle indiquait par ailleurs qu'aucun candidat de remplacement n'avait jusqu'alors déposé un dossier accompagné des pièces usuellement requises, soit en particulier une attestation de non-poursuite et un certificat de salaire. Le 30 mars 2006, Y._ a fait notifier à X._ un commandement de payer le montant de 3'150 fr. plus intérêts, correspondant au loyer de mars 2006. La poursuivie a formé opposition. B. Par requête du 27 mars 2006, X._ a ouvert action contre Y._, concluant notamment à ce qu'il soit constaté qu'elle était libérée de ses obligations dès le 15 février 2006 et à ce que la bailleresse soit condamnée à lui payer les montants de 1'500 fr. et 1'575 fr. plus intérêts. Non conciliée, l'affaire a été portée devant le Tribunal des baux et loyers du canton de Genève. Y._ a conclu à ce qu'il lui soit donné acte de son engagement de rembourser à la locataire le montant de 1'500 fr. plus intérêts et, pour le surplus, à ce que X._ soit déboutée de ses conclusions. A titre reconventionnel, la bailleresse demandait la condamnation de la locataire à lui payer 18'298 fr. plus intérêts, la levée de l'opposition formée au commandement de payer et la libération en sa faveur de la garantie bancaire. Le montant de 18'298 fr. représentait les loyers jusqu'à l'échéance contractuelle (4 x 3'150 fr. = 12'600 fr.), la facture relative à la taille de la haie (4'198 fr.) et les frais de remise en état de la maison (1'500 fr.). Par jugement du 28 novembre 2007, le Tribunal des baux et loyers a condamné la locataire à payer à la bailleresse 12'600 fr. avec intérêts à 5% dès le 30 avril 2003 (recte: 2006) (chiffre 1), prononcé la mainlevée de l'opposition (chiffre 2), donné acte à la bailleresse de son engagement à verser à la locataire le montant de 1'500 fr. plus intérêts (chiffre 3) et débouté les parties de toutes autres conclusions (chiffre 4). X._ a interjeté appel. Pour sa part, Y._ a formé un appel incident; à cette occasion, elle a augmenté sa prétention en remboursement des frais de remise en état de 1'500 fr. à 1'680 fr. Statuant le 16 juin 2008, la Chambre d'appel en matière de baux et loyers du canton de Genève a annulé les chiffres 1 et 4 du jugement entrepris; statuant à nouveau, elle a condamné la locataire à payer à la bailleresse le montant de 12'600 fr. avec intérêts à 5% dès le 15 avril 2006, ordonné la libération de la garantie bancaire en faveur de la bailleresse à concurrence de ce montant et confirmé le jugement de première instance pour le surplus. La cour cantonale a retenu notamment les éléments suivants: le 9 janvier 2006, une femme a appelé la régie immobilière pour faire part de son intérêt à la location de la maison par elle-même et deux colocataires; le contenu de l'entretien n'a pas pu être établi, les deux interlocutrices soutenant, sous la foi du serment, des versions contradictoires; il n'est pas établi que la régie ait reçu un dossier, comportant les éléments nécessaires pour permettre à la bailleresse de se déterminer en connaissance de cause au sujet des trois personnes, dont elle ignorait du reste les coordonnées exactes; les trois candidates ont certes indiqué avoir «certainement» adressé un dossier à la gérance, mais aucune d'entre elles ne se souvenait avoir elle-même procédé à une telle démarche, et la régie a contesté qu'un tel dossier lui soit parvenu; s'il était ainsi établi qu'une candidate à la location de la maison avait pris contact oralement avec la régie, il n'en demeurait pas moins que sa solvabilité n'était pas connue, la seule affirmation selon laquelle les trois colocataires potentielles gagneraient ensemble 15'000 fr. par mois n'étant pas suffisante. C. X._ interjette un recours en matière civile. Elle conclut à l'annulation de l'arrêt cantonal, puis à ce qu'il soit constaté qu'elle est libérée de ses obligations contractuelles dès le 15 février 2006, à ce que la libération de la garantie bancaire soit ordonnée en sa faveur et à ce qu'il soit donné acte à la bailleresse de son engagement de lui verser 1'500 fr. avec intérêts à 5% dès le 1er juillet 2003. Y._ propose que le recours soit déclaré irrecevable, subsidiairement qu'il soit rejeté. 