События повести происходят в конце XIX века в деревне Переброд на окраине Полесья. Молодой мужчина-повествователь, которого «судьба забросила на шесть месяцев в глухую деревушку Переброд Волынской губернии, на окраину Полесья», нестерпимо скучает. Единственные его развлечения — охота со слугой Ярмолой и попытки обучить последнего грамоте. Однажды, во время жуткой метели, герой узнаёт от обычно несловоохотливого Ярмолы о том, что верстах в десяти от его дома живёт самая настоящая ведьма Мануйлиха, которая невесть откуда появилась в селе, а затем была выселена за его пределы за свои колдовские деяния. Возможность познакомиться с ней появляется быстро: как только потеплело, герой отправляется на охоту и, заблудившись в лесу, натыкается на хату.
Предположив, что здесь живёт местный лесник, он заходит внутрь и обнаруживает там старуху «со всеми чертами бабы-яги, как её изображает народный эпос». Мануйлиха встречает героя неприветливо, но заметно оживляется, когда тот достаёт серебряный четвертак и просит старуху погадать. В самый разгар гадания в дом заходит внучка ведьмы, Олеся, темноволосая красавица «лет двадцати — двадцати пяти». Она относится к рассказчику приветливо и показывает ему дорогу домой. Все первые весенние дни образ Олеси не покидает мысли рассказчика. Когда лесные дороги просыхают, рассказчик отправляется в избушку колдуньи. Как и в первый раз, внучка встречает гостя куда приветливей, чем Мануйлиха. А когда гость просит Олесю погадать ему, та признаётся, что уже однажды раскинула на него карты и нагадала, что в этом году выпадает ему «большая любовь со стороны трефовой дамы с тёмными волосами». А тем, «кто будет вас любить, вы много горя принесёте». Ещё карты рассказали Олесе, что трефовой этой даме герой принесёт позор, который хуже смерти…
Провожая рассказчика, Олеся попытается доказать ему, что ей и её бабке принадлежит настоящий дар колдовства, и проводит над ним несколько опытов — Заживляет ему глубокий порез и заставляет его спотыкаться вслед за ней. Потом герой пытается разузнать, откуда все-таки пришла Мануйлиха в Полесье, на что Олеся отвечает уклончиво, что бабушка не любит говорить об этом. Тогда же рассказчик впервые представляется — его зовут Иван Тимофеевич.
С этого дня герой становится частым гостем в избушке. Олеся всегда рада его видеть, хоть и встречает сдержанно. А вот старуха не особенно довольна, но Ивану удаётся задобрить её подарками, помогает и заступничество Олеси. Ивана очаровывает не только красота Олеси. Его привлекает и её самобытный ум. Между ними разгорается множество споров, когда Иван пытается научно обосновать Олесино «чёрное искусство». Несмотря на разногласия, между ними возникает глубокая привязанность. Тем временем у Ивана портятся отношения с Ярмолой, который не одобряет его знакомства с колдуньей.
Не нравится слуге и то, что обе ведьмы боятся церкви. Однажды, когда Иван в очередной раз приходит в избу, он застаёт колдунью и её внучку расстроенными: местный урядник приказал им убираться из хаты в двадцать четыре часа и пригрозил пустить их по этапам в случае непослушания. Герой вызывается помочь, и старуха не отказывается от предложения, несмотря на Олесино недовольство. Иван упрашивает урядника не выгонять женщин из дома, на что тот возражает и называет старуху с внучкой «язвой здешних мест». Задобрив урядника угощениями и дорогими подарками, Иван всё же добивается своего. Урядник обещает оставить в покое Мануйлиху и Олесю. С этого времени Олеся начинает избегать Ивана и любых объяснений с ним. Тут Иван неожиданно и серьёзно заболевает — шесть дней его «била ужасная полесская лихорадка». И лишь после выздоровления ему удаётся объясниться с Олесей. Девушка избегала встреч с Иваном лишь потому, что хотела уйти от судьбы.
Поняв, что это невозможно, она признаётся ему в любви. Иван отвечает ей взаимностью, но Олеся всё не может забыть про своё гадание. Однако, несмотря на дурные предчувствия Ивана и злобу Мануйлихи, их любовь расцветает. Тем временем служебные обязанности Ивана в Переброде заканчиваются, и всё чаще приходит к нему мысль жениться на Олесе и забрать её с собой. Убедив себя в правильности этого решения, он делает предложение любимой. Но Олеся отказывается — она не хочет портить жизнь молодому, образованному барину. Девушка даже предлагает Ивану просто поехать за ним, безо всякой женитьбы. У Ивана возникает подозрение, что её отказ связан с боязнью церкви, на что Олеся говорит, что ради любви к нему она готова перебороть это суеверие. Она назначает ему встречу в церкви на следующий день, в праздник Святой Троицы, а Ивана охватывает ужасное предчувствие. На следующий день Иван задерживается по служебным делам и не успевает вовремя попасть в церковь.
Вернувшись домой, он застаёт у себя местного конторщика, который рассказывает ему о сегодняшней «потехе» — деревенские девки поймали на площади ведьму, которой задали встряску, хотели вымазать дёгтем, но той удалось сбежать. Действительно, Олеся пришла в церковь, отстояла обедню, после чего на неё накинулись деревенские бабы. Чудом вырвавшись, Олеся пригрозила им, что они ещё вспомнят её и наплачутся досыта. Все эти подробности Иван узнаёт позже. А пока же он мчится в лес, и застаёт в хате избитую Олесю без памяти, охваченную лихорадкой, и проклинающую его Мануйлиху. Олеся приходит в себя и объясняет Ивану, что им с бабкой нельзя больше здесь оставаться, поэтому ей и Ивану придётся расстаться. На прощание Олеся признаётся, что хотела бы иметь ребёнка от Ивана и жалеет, что его нет.
Этой же ночью на Переброд обрушивается сильный град. Утром Ярмола будит Ивана и советует ему убираться из деревни — град, который побил жито у половины села, по мнению деревенских, был наслан колдуньями из мести, и озлобленный народ уже начинает «кричать недоброе» про Ивана. Желая предупредить Олесю о грозящей ей беде, герой мчится в избу, где находит лишь следы спешного бегства и яркие красные бусы, которые остались единственной памятью об Олесе и её нежной, великодушной любви…