Our Cape Town NLP development addresses the low-resource language challenge that defines South African NLP. Low-resource language strategy: (1) The core challenge is training data scarcity. English has billions of words of training data; isiZulu has perhaps 50 million; Tshivenda might have 2 million. We use three strategies to build effective NLP for South African languages despite limited data: cross-lingual transfer learning (training on high-resource languages and transferring knowledge to related low-resource languages — Bantu languages share grammatical structures that enable this), multilingual pre-training (models like AfroXLMR and AfriBERTa, pre-trained on African language data, provide better starting points than English-centric models like BERT or GPT), and active learning (strategically selecting the most informative examples for human annotation, maximizing model improvement per annotation dollar). (2) For the Nguni language cluster (isiZulu, isiXhosa, siSwati, isiNdebele) and the Sotho-Tswana cluster (Sesotho, Setswana, Sepedi): we leverage linguistic similarities within each cluster. A model trained on isiZulu data transfers more effectively to isiXhosa than to Sesotho, because isiZulu and isiXhosa share 85%+ mutual intelligibility. We train cluster-level models and fine-tune for individual languages. (3) Agglutinative morphology handling: Bantu languages are agglutinative — grammatical information is encoded through prefixes and suffixes attached to roots. "Asibafundisi" (isiZulu — "we do not teach them") is a single word containing: negative prefix "a-", subject concord "si-" (we), object concord "-ba-" (them), and verb stem "-fundis-" (teach) with final vowel "-i". Standard tokenizers break this into meaningless subword pieces. Our Bantu language tokenizers decompose words morphologically, enabling meaningful text analysis. Practical NLP applications: (1) Multilingual intent classification for contact centers: we train intent classifiers that work across all 11 South African languages. A customer saying "Ngifuna ukuvala i-account yami" (isiZulu — "I want to close my account") and "Ek wil my rekening toemaak" (Afrikaans — same meaning) should both be classified as "account closure request." Our classifiers achieve this through multilingual embedding that maps semantically equivalent expressions across languages into the same vector space. (2) Sentiment analysis calibrated for South African expression patterns: positive and negative sentiment are expressed differently across South African cultures. Direct complaint language varies between cultures — some are explicitly negative ("terrible service"), others express dissatisfaction indirectly. Our sentiment models are trained on South African data that captures these cultural communication patterns. (3) Named entity recognition for South African context: recognizing South African person names (which follow different patterns across language groups — Nguni patronymic naming, Sotho-Tswana naming conventions, Afrikaans naming), South African place names (often in indigenous languages with English alternatives), South African organization names (government departments, SOEs, companies), and South African identity numbers (13-digit ID numbers embedded in text).