[{"content":"After flying a quarter of the globe and finally making it to Germany, is your first week a total mess? Here’s a quick look at what needs to be handled first.\n✨ Intro # During the first two weeks after arriving in Germany, the most important thing is to finish all the basic administrative procedures first. This post organizes the things exchange students should prioritize after arrival, and hopefully helps you settle into life in Germany more smoothly.\n👉 Related reading (still being written and will be updated later):\n🏠 Daily Life Guide (mobile plan, online banking account, monthly transport pass, daily shopping, etc.) 🎓 TUM School Guide (a timeline specifically for Technical University of Munich) 🗂️ Administrative Matters # Registration, activating public insurance, and activating your blocked account are the three most important administrative tasks during the first one to two weeks after arriving in Germany. I was pretty confused about the order at first, but in practice, there isn’t a strict dependency between them, so you can do them in parallel.\nWhen preparing documents, you usually need these basic conditions first: a German phone number, a German address, a bank account, and of course the fact that you have officially arrived in Germany. For getting a German phone number and bank account, you can refer to the Daily Life Guide.\n1. Landing Insurance # Do you remember the “landing insurance certificate” included in your Expatrio Value Package when you applied for it? This document is also one of the required materials for your student visa application, and you can think of it as a kind of short-term transition health insurance.\nThis insurance automatically becomes active based on the arrival date you entered in Expatrio, so you do not need to activate it manually.\nArrive in Germany March 11 Your landing insurance becomes active automatically. After you complete school enrollment and activate public health insurance, the landing insurance will automatically switch over to public insurance.\n2. Registration (Anmeldung) \u0026amp; Broadcasting Fee # What people usually call Anmeldung basically means residence registration, and it’s something you should do as soon as you arrive in Germany.\nA. Book an Appointment (Termin): # I’d recommend booking your Anmeldung appointment early. Under German regulations, you’re supposed to complete registration within two weeks after arrival, but appointment slots are limited and often hard to get. So people usually start refreshing for appointment slots online one to two weeks before move-in. If you’ll move into student housing right after arriving in Germany, then you can book it while still in Taiwan (and even if you go a bit over the two-week window, it usually won’t be a big deal XD).\nBook your Anmeldung appointment online March 9 You don’t have to book it as early as I did. Usually one to two weeks before move-in is enough. I personally booked mine for April 8. ▲ Successful booking screen 👉 Munich registration appointment page\nPlease note that you need to switch the website to the German interface, otherwise the booking button will not show up at all (and yes, this was still true in 2026, sigh).\nFor the appointment type, choose Wohnsitzanmeldung, then select your time and location, fill in your contact information, and submit.\nB. Required Documents \u0026amp; What the Process Was Like: # Passport Wohnungsgeberbestätigung (confirmation from the housing provider) Note that this is not the Tenancy Agreement you received earlier. If you rent privately, you can ask your landlord for it. In my case, the dorm sent this document the day before move-in. I downloaded it on my phone and then printed it at dm. Meldeschein (registration form) I printed and brought it with me in advance too, but it turned out I didn’t actually need it. The staff just asked the relevant questions verbally and filled it out for me. Received the dorm\u0026#39;s housing confirmation document March 31 Wohnungsgeberbestätigung, which basically means a housing confirmation document, is one of the required documents for registration. ▲ Housing confirmation document (Wohnungsgeberbestätigung) Dorm move-in date April 1 This was the earliest move-in date for my dorm, but I was actually in Greece at the time, so I asked another exchange student friend to help me pick up the key XD. Go register in person April 8 I arrived around twenty minutes early and waited for my number to be called (your booking confirmation email includes the number). The whole process only took around ten minutes, and the staff could communicate in English, so overall it went pretty smoothly. ▲ Waiting on site at Bürgerbüro Leonrodstraße Follow-up 1: Tax ID # After you finish registration, you’ll receive a letter after a while containing your tax ID (Identifikationsnummer, IdNr).\nOnce you receive it, remember to manually add it to both Revolut and the Expatrio App:\nRevolut: Go to Account → Personal details → Additional information, find the Tax residency section, and edit your IdNr to add your German tax ID. Expatrio: Go to Personal Data, and add a new German tax ID entry below your original Taiwan tax ID. Received the letter containing my tax ID April 21 ▲ Physical tax ID letter Follow-up 2: Broadcasting Fee # After that, you’ll receive a payment notice for the broadcasting fee (Rundfunkbeitrag).\nSince my dorm was a WG (shared apartment), only one roommate needed to pay the broadcasting fee for the whole apartment, so once we split it, the cost per person was actually quite low. In my case, in an 8-person WG, it worked out to around only 8 euros per person every three months (paid to the person handling it).\nUsually the earliest person to move in becomes the one who pays. If you move in later, then after receiving the letter, you just need to go online and declare that someone in the WG is already paying for it.\nThe top right corner of the letter shows the case number (Aktenzeichen), and you also need to get the contribution number (Beitragsnummer) from the roommate who is paying. After that, you can scan the QR code on the letter to enter the official broadcasting fee website, then follow this tutorial to finish the declaration.\nReceived the broadcasting fee notice Early May ▲ Physical broadcasting fee letter 3. Activate Your Blocked Account # This is also something you should finish as soon as possible after arriving in Germany, since your living expenses for the next seven months are all sitting in this account. At first I thought I had to complete Anmeldung before activating it, but in reality, all you need is a German phone number, a bank account, and a German address.\nOne thing worth noting is that Expatrio also provides its own bank account option, so whether to use it depends on your own needs. I personally chose Revolut because it was more convenient for transferring money with friends.\nA. Prepare These First: # Expatrio mobile app: for identity verification Passport \u0026amp; visa German phone number: I used Fraenk Online bank account IBAN: I used Revolut German address: it’s enough to prepare relevant proof for your dorm address. After registration, you’ll need to add your tax ID within three months in the app. B. Online Activation Process: # You have to activate your blocked account through the Expatrio mobile app. First, you need to upload a scan of your visa, and then complete a live identity verification (similar to activating Revolut), so it’s best to do this during their working hours.\nAfter the verification is completed, the app usually shows successful activation within a few minutes. Expatrio will give you a dedicated bank account number (IBAN), and you can decide whether you want to use it. You can also manually enter your own bank account IBAN and transfer amount in the Expatrio App, or set it as the default receiving account. After I finished setting it up, every later payout was automatically sent to Revolut.\nUpload the required documents for Expatrio blocked account activation April 8 After uploading the documents, I realized it wasn’t during live verification hours, so I had to wait until the next workday to continue XD. ▲ Document review passed notification Live agent verification April 9 For the live verification, you need your passport and the documents above, and you can choose service in English. The staff sounded pretty dead inside and talked fast, but as long as you just follow the instructions, show your passport, read out your number and birthday, and so on, it’s fine. The whole process took around five minutes. ▲ Verification approved notification First €992 payout received April 9 The actual transfer was quite fast. About half an hour after the account was activated that same day, I received the first blocked amount, and even the second and third payouts also arrived on the same day. ▲ First blocked amount payout notification (March) Later monthly payouts 25th of every month After that, payouts were sent on the 25th of every month, so there was no need to worry about living expenses not arriving on time. ▲ Final blocked amount payout (September) plus remaining buffer payout notification 4. Activate Public Health Insurance # The last step was the TK public health insurance that came with the Expatrio package. After arriving in Germany and completing school enrollment, you can activate it through the Expatrio App by going to the Activate TK page and filling in the following information:\nGerman Bank Account IBAN \u0026amp; BIC: used for the monthly public insurance deduction Certificate of Enrollment: in my case, I updated my German address in TUMonline and then downloaded it German Address German Phone Number: I used Fraenk After activating public insurance, you’re supposed to receive a digital ISIC international student card too. But I waited forever and only got it much later, so honestly it almost felt like it didn’t exist (?\nIf you’re interested, you can also check out this article: Student ID, ISIC, ESN Card: The Three International Student Cards You Need for Exchange in Europe\nUpload the required information April 10 After uploading everything, I received the email below and then just had to wait for review. ▲ Status update after upload The TK public insurance status in the Expatrio App also updates step by step, from the in-progress status shown on the left to the completed activation status shown on the right.\nReceived the TK activation success email April 11 The email explains that physical mail and an activation code will be sent later (for registering your TK online account). You’ll also receive the EHIC European health insurance card after a while, while the ISIC will be sent separately by email. ▲ TK activation success email Even though I already knew student public insurance wasn’t cheap, seeing the actual monthly premium of 144 euros still felt kind of expensive. But switching to private insurance is more complicated, so I ended up staying with public insurance. If you want to make better use of your public insurance benefits, I’d also really recommend considering the HPV vaccine, which is fully covered by public insurance. For the full experience, you can check this post 👉 Germany TK HPV Vaccine Guide.\nReceived physical mail April 15 Over the next few days, I received several physical letters, including printed copies of the four documents mentioned in the earlier email, instructions for uploading a profile photo for the health insurance card, bank account binding confirmation, and a notice containing my personal insurance number (**Versicherungsnummer**). I’d recommend keeping the insurance number letter safe. ▲ So many letters\u0026hellip; Received the Activation Code letter April 21 To register for TK, you need both the activation code and the ten-digit insurance number printed on the physical card itself, not the personal insurance number (**Versicherungsnummer**) from the earlier letter. So at this point, you still need to wait for the actual card to arrive. ▲ Physical Activation Code letter Received the physical EHIC insurance card April 29 You can then download the TK App (it has an English interface built in), and use the card number plus the activation code you received earlier to complete registration. The whole process was pretty smooth, and I didn’t run into any issues. ▲ TK insurance card ▲ TK App Apply for the €69 cashback May 8 After public insurance is activated, you’ll receive an email saying that you can claim the 69 euro cashback included in the Expatrio package. The money showed up about a week later. ▲ Click Cashback Received the ISIC digital student card email June 12 After waiting a really long time, I finally got the ISIC student card email. After downloading the app, the activation process was actually fast and simple, but in reality I almost never used it XD. ▲ ISIC email 🔗 Reference Links # For Anmeldung, you can also check other people’s experiences here:\n慕尼黑市政廳登記住址（入籍教學）Anmelden簡單迅速！ 德國 Anmeldung 入籍教學 | 慕尼黑(München)篇 – 留學計畫 德國交換 | 入籍證明 Anmeldung - 德國鬼的180天養成計畫 - Medium For blocked accounts, you can also check these experiences:\n【德國交換學生】初到德國篇 | 德國手機號碼、德國入籍、N26開戶、開通Blocked Account、開通保險TK 【德國交換學生】德國簽證申請 | 德國簽證預約、限制提領帳戶 | 2023德簽申請全紀錄 文件準備 \u0026amp; 經驗細節 For TK public insurance, you can also check this experience:\nTK 公立保險 | 入境德國後開通保險須知 ","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/posts/exchange-student-survival-guide-3-1-administrative-matters-after-arrival-in-germany/","section":"All Posts","summary":"","title":"🇩🇪 Exchange Student Survival Guide – Part 3-1: What to Do After Arriving in Germany (Administrative Matters)","type":"posts"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/posts/","section":"All Posts","summary":"","title":"All Posts","type":"posts"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/tags/anmeldung/","section":"Tags","summary":"","title":"Anmeldung","type":"tags"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/tags/blocked_account/","section":"Tags","summary":"","title":"Blocked Account","type":"tags"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/tags/exchange_student/","section":"Tags","summary":"","title":"Exchange Student","type":"tags"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/categories/exchange-student/","section":"Categories","summary":"","title":"Exchange Student Related","type":"categories"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/tags/expatrio/","section":"Tags","summary":"","title":"Expatrio","type":"tags"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/tags/tk/","section":"Tags","summary":"","title":"TK","type":"tags"},{"content":"","date":"28 Mar 2026","externalUrl":null,"permalink":"/en/","section":"Was Wei weiß","summary":"","title":"Was Wei weiß","type":"page"},{"content":"It took me a while, but here finally comes Part 2 XD — let’s take a look at what to prepare before departure!\n📍 Background \u0026amp; Exchange Overview # Exchange Period: March 2025 – September 2025 (early spring to late summer) Location: Munich, Germany (capital of Bavaria, Southern Germany) I went to Munich, Germany for one semester during the 2025 summer term. Although the semester officially started in April, I departed in early March. This period spanned from the cold, damp early spring to the hot summer, meaning I had to pack both heavy winter jackets and short-sleeve summer clothes.\nThis article is based on my pre-departure preparation and real-life experience after arriving in Germany. I’ve organized a practical packing checklist for exchange students to help you make smarter packing decisions.\nWhat should you definitely bring from Taiwan? What can you buy after arriving in Germany? Most importantly, how do you maximize limited luggage weight and space while bringing what truly matters? I hope this gives you some inspiration.\n🧳 My luggage setup:\n29-inch checked suitcase (25 kg limit) One backpack (7 kg carry-on) One compact crossbody bag (for passport \u0026amp; valuables, anti-theft) 🧠 Core Packing Principles: Bring vs. Buy in Germany # Everyone’s situation is different, but after living in Germany, I’ve summarized some key packing principles and real examples to help you decide whether to bring an item or buy it locally.\nBring from Taiwan # Essential documents \u0026amp; money: passport, international driver’s license, important documents, euros, credit cards… Asian lifestyle essentials: travel-size containers, foldable eco shopping bag, disposable facial towels, sealing clips, stationery, acne patches, pocket tissues, foldable hangers, reusable chopsticks, Taiwanese seasonings, EU adapters… Expensive to replace: winter coat, running shoes, Wi-Fi router, memory cards, contact lenses… Needed immediately upon arrival: small toiletry kit, toothbrush, towel, winter coat… Basic medicines: cold medicine, painkillers… Buy in Germany # Daily consumables: toilet paper, detergent, shampoo, body wash… Kitchen \u0026amp; cleaning: cookware, plates, sponges, cleaning cloths, trash bags, mop… Supplements: Vitamin B complex, multivitamins (cheap and widely available at dm)… Home appliances: hair dryer, electric kettle… Some clothing: summer outfits, sportswear… 👉 If you want a relaxed and simple prep, this is probably enough.\n👉 If you want detailed lists and specific recommendations → keep reading!\n🎒 Detailed Packing List \u0026amp; Practical Advice # Categories below (click to jump or scroll to 👉 Full Checklist):\n📄 Essential Documents 👕 Clothing 🧴 Daily Items \u0026amp; Toiletries 💊 Medicine \u0026amp; Health 💻 Electronics 📦 Others 📄 Essential Documents # Must-bring items include your passport (with visa), credit cards, debit cards, euros in cash, and copies of important documents, which can include your admission letter, dorm contract, flight confirmation, and military exit permit (if applicable).\nYou can refer to my 👉 Full Checklist for details.\nI also brought photocopies of my passport and visa just in case.\n📌 Practical Tips # Print all important documents and keep them in a document folder inside your carry-on bag. Before receiving your student ID, your admission letter can often serve as temporary proof of student status (e.g., for student tickets). Make sure your bank cards are enabled for overseas withdrawal and payments. Bring a few passport photos (I used one for the ESN card). If you plan to drive, bring both your international driver’s license and Taiwanese license. 👕 Clothing # Prepare according to season and climate. During the summer semester in Munich, temperatures can range from 0°C in early spring to 30°C in peak summer.\n📌 Practical Tips # It can feel as cold as a Taiwanese cold wave when you first arrive — bring sufficient warm clothing. Asian body sizes may not always fit European cuts well — bring enough long pants. Jeans are durable and practical for travel. Summer heat usually starts around mid-June; you can buy summer clothes later if needed. Sportswear and swimwear can be bought cheaply at Decathlon. Uniqlo did not have a store in Munich, and the nearest one was in Stuttgart. If you’re used to wearing Japanese-style thermal wear (e.g., Heattech), it’s recommended to bring them from Taiwan. (Update: Uniqlo opened its first Munich store in November 2025!) Functional shoes (waterproof, slip-resistant, insulated) or running shoes — if you plan to hike, do outdoor activities, or run regularly and don’t want to purchase new ones locally, it’s best to bring your own. Compression bags are extremely useful, especially for packing bulky items like down jackets and sweaters, as they can significantly save luggage space. 📦 The Actual Quantities I Packed # Heavy down jacket ×1 Long-sleeve sweaters ×2, long-sleeve tops ×2, light jacket ×1 Jeans ×2, lightweight long pants ×2 Short-sleeve tops ×3, shorts ×2, sleep shorts ×2 Sports outfit (top + shorts) ×1 Thermal long-sleeve base layers ×3, short-sleeve undershirts ×2 Underwear ×6, socks ×6 Beanie ×1, scarf ×1 Casual shoes ×1, functional shoes ×1, running shoes ×1 Slippers ×1 🧴 Daily Items \u0026amp; Toiletries # There are quite a lot of miscellaneous items in this section, and I’ve included quite a few practical suggestions. For full details, please refer to 👉 Full Checklist.\nMost of these items can also be purchased in Germany, so you can decide whether to bring them from home or buy them locally. Some are more convenient to bring in advance, while others aren’t really necessary.\n📌 Practical Tips # Bring essential toiletries for the first few days (toothbrush, toothpaste, bath towel, face towel). Although you can buy them in Germany, you may need them immediately upon arrival. It’s a good idea to pack a small tube of toothpaste and a travel toiletry kit. Bring a travel toiletry bag and small refill bottles from Taiwan. They’re very convenient for short trips when carrying shampoo or body wash. Remember that liquids in carry-on luggage must be under 100ml. Large bottles are generally unnecessary unless you have a specific brand preference — you can easily buy them in Germany and save luggage space. German drugstores like dm carry a wide variety of shampoo, body wash, conditioner, facial cleanser, lotion, lip balm, toothpaste, skincare products, sunscreen, and cosmetics. Bring laundry bags (one large and one small) and foldable hangers. They’re practical for drying towels when traveling. Regular hangers and drying racks can be purchased locally. Cleaning cloths, trash bags, and sponges can all be purchased at local dm stores — no need to bring them from Taiwan. Strongly recommend bringing a reusable shopping bag, preferably a foldable one. It’s very convenient for supermarket runs. A large-capacity duffel bag is optional depending on your needs. Later on, I got used to traveling with just one backpack — much lighter and easier. After seeing how budget airlines sometimes charge more for carry-on luggage than the ticket itself, you’ll quickly adapt to packing light. I used the large bag at the beginning for transporting bulky household and kitchen items. Food clips and rubber bands are highly recommended — you’ll use them often to seal food packages. Bring reusable chopsticks (super convenient for instant noodles). Other utensils like knives, forks, spoons, plates, and bowls can be purchased in Germany. A neck pillow was only useful for long-haul flights to and from Germany. For bus travel, I found it bulky and inconvenient, and it ended up sitting unused in my dorm room. If you wear contact lenses, bring enough supply. You can buy them here, but it’s better to bring the brand you’re used to. I personally wear them while traveling and regretted bringing only a 30-day supply — daily lens users should bring extra. If you use orthokeratology lenses, make sure to bring all necessary cleaning supplies. Bring a lock (combination padlock recommended). You’ll need it for hostel lockers. Choose one with a slightly larger shackle to ensure it fits. Pack extra pocket tissues. They’re available in Germany, but you may not like the type or find convenient pocket-sized packs easily. Disposable facial cleansing towels are compact and very useful if you need to stay overnight at the airport. 📎 Stationery – Recommended to Bring # You can find stationery in Germany if you look carefully, but it’s usually more expensive and not always as convenient or high quality.\nBlack / blue / red pens, mechanical pencil + extra lead Correction tape + refills, utility knife, scissors, tape, ruler Folders, paper clips, binder clips Scientific calculator (if required for exams) Blank A4 paper (some exams allow you to bring a cheat sheet) Personally, I rarely used stationery since most things are digital nowadays — mainly just during final exams. However, there were moments when I felt very relieved that I had brought certain items (like folders, scissors, tape, and blank A4 paper) with me 😆\n💊 Medicine \u0026amp; Health # Getting sick abroad is the worst — especially during a 6-month stay.\n📌 Practical Tips # Be sure to bring your personal prescription medications. As for basic over-the-counter medicines, it’s recommended to visit a pharmacy in Taiwan before departure and ask, “What medicines and quantities would you suggest for a six-month stay abroad?” Prepare everything at once. No one wants to get sick in an unfamiliar place and have to read German instructions or rush to a pharmacy at the last minute. Supplements such as vitamin B complex and multivitamins are affordable and widely available in Germany. You can bring a small supply from Taiwan to use at the beginning, and then restock at dm or Rossmann locally. You don’t need to bring too many face masks. I used fewer than ten over six months, mainly for flights or when I caught a cold. Bring your own acne patches. I didn’t specifically look for them in Germany, but they don’t seem easy to find. 🩹 Recommended Basic Medicine # Cold medicine, stomach medicine, painkillers, altitude sickness pills, motion sickness pills, wound ointment, cotton swabs, band-aids, etc.\n💻 Electronics # Items in this category tend to be relatively expensive, so in most cases it’s recommended to bring them from Taiwan. One important thing to pay attention to is the issue of voltage and plug compatibility. For household appliances, it’s actually better to purchase them locally (👉 Should you bring a hair dryer?). I’ll explain this in more detail below.\n📌 Practical Tips # Note that power banks and lithium batteries cannot be checked in and must be placed in your carry-on luggage. If you plan to take photos, it is recommended to bring your own memory cards from Taiwan, as they are more expensive in Europe. If you will be staying in hostels, some beds only provide USB-A ports, so it’s a good idea to prepare a USB-A cable as a backup. A Wi-Fi router depends on the dormitory’s network setup. Some rooms only provide an Ethernet port; if you prefer not to buy one locally, you may bring your own. A crossbody bag can hold a small charger and cables, making it convenient to use when there are power outlets available at airports or on trains. 🔌 Plugs \u0026amp; Voltage # ▲ Image credit: Amazon-Innergie World Europe uses 220–240V / 50Hz, which is different from Taiwan’s 110V / 60Hz. Most EU countries use two round-pin sockets (Type C, E, F).\nThe United Kingdom and Ireland use the British three-rectangular-pin plug (Type G). If you plan to travel to those countries, it is recommended to prepare an additional UK adapter or a universal travel adapter. European sockets are recessed, so it is recommended to buy adapters with “long enough pins,” especially since some bulky universal adapters are poorly designed. German sockets have a pin diameter of 4.8 mm, while standard European sockets use 4.0 mm. When purchasing an adapter, pay attention to the specifications. It is recommended to choose 4.0 mm pins (European Type C) for better compatibility, to avoid being unable to plug into sockets in other countries due to thicker pins. It is recommended to bring 2–4 adapters — some for dorm use and some for travel, adjusting based on the number of electronic devices you have. ⚠️ Always check whether your device supports 100–240V input before plugging in. Most phone/laptop chargers do — you only need a plug adapter.\nAbout Hair Dryers Should You Bring a Hair Dryer? # Since hair dryers from Taiwan usually only support 110V, they must be used with a high-wattage transformer, which is bulky and heavy. Therefore, it is strongly recommended to purchase one locally instead (for example, in Germany you can find budget options under NT$400 at electronics stores such as Saturn). ⚠️ High-wattage appliances such as hair dryers and electric kettles should be plugged directly into a wall outlet, and should not be connected to an extension cord.\nAbout Extension Cords Should You Bring an Extension Cord? # If you have enough European plug adapters, it is recommended to purchase an extension cord locally. However, if you plan to bring one from Taiwan, please pay special attention to the following:\nChoose a version rated for 100–240V, otherwise the LED indicator or protection switch may burn out. If you insist on bringing a common 125V Taiwanese extension cord, you can refer to this article. I personally brought the most basic 125V extension cord (no LED, no protection switch), and it worked in practice, but if I were to go again, I would choose to buy one locally instead. 📦 Others # In addition to daily necessities, you can also bring a small amount of snacks or items that carry a taste of Taiwan. Not only can they help ease homesickness while abroad, but they are also great for sharing with new friends and building connections.\n📌 Practical Tips # Taiwanese snacks, such as I-Mei Puff Corn Snacks, Prince Noodles, and Want Want Senbei rice crackers, are great for making friends or exchanging and sharing. Taiwanese seasonings: Although most cities in Germany have Asian supermarkets (where you can even find Wei Lih Zhajiang Noodles XD), prices are usually higher and the selection may not be complete. If you have preferred brands of seasonings (such as Tomax), it’s recommended to bring your own as long as they are not too bulky. Small souvenirs, such as postcards, small pins, or keychains with Taiwanese characteristics, are suitable for giving to roommates or new friends you meet at exchange events. 🔥 Full Checklist 🔥 # I’ve marked the items I consider essential in bold. The rest may not be necessary depending on your situation — you can either bring them yourself or purchase them locally.\n📄 Documents 👕 Clothing 👉 Quantity 🧴 Daily 💊 Health 💻 Electronics 👉 EU Plugs 📦 Others Passport (with visa) Heavy down jacket Toothpaste, toothbrush Personal medications Phone Taiwanese snacks Credit card, debit card Thick / thin long-sleeve tops Bath towel, face towel Basic medicines Headphones Taiwanese seasonings Euro cash, wallet Light jacket Travel toiletry bag Sanitary products Laptop, tablet Souvenirs Passport photocopy Jeans / lightweight long pants Travel-size bottles Supplements Camera, camera batteries Visa photocopy T-shirts Laundry bag Masks Memory cards Admission letter Shorts Foldable hangers Eye drops Power bank (carry-on) Dormitory rental contract Pajamas Reusable shopping bag Acne patches Chargers, cables Flight booking confirmation Sportswear Large-capacity laundry bag European plug adapters Accommodation booking confirmation Heat-tech base layers Razor Universal travel adapter Enrollment certificate Underwear, socks Nail clippers USB-C hub Dubai transit visa Beanie Comb Luggage scale Blocked account certificate Scarf Zip ties, rubber bands ⚠️ Extension cord Insurance certificate Casual shoes Ziplock bags Wi-Fi router Exit permit (for conscription status) Functional shoes Water bottle, reusable chopsticks Ethernet cable International driver’s license Running shoes Neck pillow AirTag Taiwan driver’s license Slippers Eye mask, earplugs National ID card Compression bags Contact lenses Spare ID photos Glasses case, cloth Sunglasses, spare glasses Padlock Pocket tissues Alcohol wipes Disposable face towels Disposable underwear Stationery Umbrella 🔗 Reference Links # 🧭 Exchange Student Pre-Departure Briefing — Packing List 🧳 What to Bring When Going Abroad! 🌍 [Germany Exchange Student] What Should You Bring for an Exchange in Europe? | 2023 Half-Year Packing List | 23kg + 7kg Packing Guide | Includes Complete Packing Checklist Download! Germany Exchange: Pre-Departure Preparation 5 [Winter Packing Guide] – April Yang ","date":"27 Feb 2026","externalUrl":null,"permalink":"/en/posts/exchange-student-survival-guide-2-packing-list/","section":"All Posts","summary":"","title":"🇩🇪 Exchange Student Survival Guide – Part 2: Packing List","type":"posts"},{"content":"","date":"10 Jan 2026","externalUrl":null,"permalink":"/en/tags/github_pages/","section":"Tags","summary":"","title":"GitHub Pages","type":"tags"},{"content":"","date":"10 Jan 2026","externalUrl":null,"permalink":"/en/tags/google_analytics/","section":"Tags","summary":"","title":"Google Analytics","type":"tags"},{"content":"","date":"10 Jan 2026","externalUrl":null,"permalink":"/en/tags/google_search_console/","section":"Tags","summary":"","title":"Google Search Console","type":"tags"},{"content":"","date":"10 Jan 2026","externalUrl":null,"permalink":"/en/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"In Part 3, we connected GitHub Pages to our own domain.\n👉 Part 3: Namecheap registration, Cloudflare DNS, and a custom GitHub Pages domain\nOnce the site is online, I also want to know whether people are reading it and where they find the posts. Here we will set up Google Analytics 4 (GA4) and Google Search Console, using https://blog.yungwei.com/ and the site name Was Wei weiß throughout.\n1. GA4: Traffic and user behavior # GA4 helps you examine traffic sources, page views, and interaction events. Sign in to Google Analytics and find the site you intend to manage.\nIf you already have GA4, find the existing property and stream # When the same site changes its name or domain, start with its existing property and web data stream. Do not create another set merely because the name changed and split future data across properties.\nSelect the GA4 property that already tracks this website. Open Admin → Data collection and modification → Data streams, then select the existing web stream. Edit its details, using https://blog.yungwei.com/ as the website URL. You can rename the stream to Was Wei weiß. Keep the Measurement ID from that same stream, in the form G-XXXXXXXXXX, and continue using it in Hugo. Property and stream names are labels. The installed ID determines where events are sent. Updating the URL in Admin does not install tracking on the website. See Google’s stream editing instructions.\nCreate a property and stream only for a first-time setup # If you have no GA4 setup, follow the initial setup instructions: create an account and property, then add a Web stream. Choose an account name and set the reporting time zone and currency to fit your needs.\nField Example or value Property name Was Wei weiß, or a name you recognize Platform Web Website URL https://blog.yungwei.com/; if the protocol is a separate field, select HTTPS and enter only blog.yungwei.com in the URL field Stream name Was Wei weiß Measurement ID Use the generated G-... value, not this article’s placeholder I originally used the site’s domain as its property name, which also works. The label does not have to stay tied to the URL. If you already have an account, you do not need a new one for every website either.\n2. Add the Measurement ID to Hugo # With Blowfish, you do not need to edit the theme’s \u0026lt;head\u0026gt; or paste a second complete GA script. Configure Weisblog/config/_default/hugo.toml:\n[services] [services.googleAnalytics] id = \u0026#34;G-XXXXXXXXXX\u0026#34; Replace the placeholder with your own ID. If [services] or [services.googleAnalytics] already exists, edit that section rather than declaring it twice. Refer to Hugo’s services configuration and Blowfish’s configuration guide.\nHow does the theme turn that setting into tracking code? # When I inspected the Blowfish version I was using, its layouts/partials/head.html loaded analytics only in production:\n{{/* Analytics */}} {{ if hugo.IsProduction }} {{ partial \u0026#34;analytics/main.html\u0026#34; . }} {{ end }} Then analytics/main.html checked for the GA ID:\n{{ if site.Config.Services.GoogleAnalytics.ID }} {{ partial \u0026#34;analytics/ga.html\u0026#34; . }} {{ end }} Finally, analytics/ga.html inserted the configured ID into the Google tag:\n\u0026lt;script async src=\u0026#34;https://www.googletagmanager.com/gtag/js?id={{ site.Config.Services.GoogleAnalytics.ID }}\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag(\u0026#39;js\u0026#39;, new Date()); gtag(\u0026#39;config\u0026#39;, \u0026#39;{{ site.Config.Services.GoogleAnalytics.ID }}\u0026#39;); \u0026lt;/script\u0026gt; These snippets explain the theme’s behavior. Do not paste them into your post or layout again. File locations and contents can change between theme versions; use the version you have installed as the reference.\nOrdinary hugo server uses the development environment. The production check above prevents GA from loading in that local preview. Explicitly choosing production or adding another tracking snippet can still send test events. Production builds use the production environment; before publishing, check that the ID and tracking have not been disabled.\nIf you use the Actions workflow from Part 2, preview and review the changes, then push to rebuild the site:\ngit add . git commit -m \u0026#34;Configure Google Analytics\u0026#34; git push Verify that events reach the correct stream # After publishing, open your production website and watch the same GA4 property’s Realtime report for events matching your test time. If needed, use Google Tag Assistant to check the ID and page URL, including whether tracking was installed twice.\nA “data collection enabled” message or a nonzero active-user count alone does not prove the new domain is configured correctly. Those events could come from an old URL or another page. Check the ID, production page, and actual events together. Tracking blockers, consent settings, and reporting delays can also affect whether you see a test immediately.\n3. Search Console: Search indexing # Google Search Console shows search impressions, clicks, index status, and website issues. GA4 covers behavior after visitors arrive, while Search Console helps examine the Google Search side.\nSEO means search engine optimization: making content and site structure easier for search engines to understand. Ownership verification does not guarantee rankings or immediate indexing.\nCheck what your existing property covers # Start with existing Search Console properties too, but their scope differs from GA4. GA4 can keep tracking the moved site through the original stream; Search Console properties cover a defined domain or URL prefix.\nExisting property Does it cover https://blog.yungwei.com/? Domain property yungwei.com Yes, including its subdomains and protocols Domain property blog.yungwei.com Yes, it covers this subdomain URL-prefix https://blog.yungwei.com/ Yes, it covers this HTTPS prefix Another domain, or URL-prefix https://yungwei.com/ No; use a property that covers the blog’s new URL You do not need to recreate properties every time, but renaming an old domain’s property does not verify a new domain. Keep old properties for their history, and switch to a property covering the new URL for the following steps. See Google’s property scope rules.\nAdd and verify a property when none fits # If you manage DNS and want coverage for the whole domain, add a Domain property for yungwei.com, without a protocol or path. To focus on the blog alone, you can use URL-prefix https://blog.yungwei.com/. If you still use the default project site, enter https://\u0026lt;username\u0026gt;.github.io/Weisblog/ instead.\nI previously chose DNS verification for my custom domain. For a Domain property covering yungwei.com, copy the verification value provided by Google and add it in Cloudflare’s yungwei.com zone:\nField Value Type TXT Name @, the apex domain being verified here Content The complete google-site-verification=... value provided by Google TTL Auto If the Domain property is instead blog.yungwei.com, follow its verification instructions and place the record at blog, rather than always entering @. This TXT record verifies ownership; the routing CNAME from Part 3 cannot replace it. Do not overwrite other TXT records.\nReturn to Search Console and verify. If it fails initially, check the TXT name and content and confirm Cloudflare is the authoritative DNS provider before waiting for propagation. Keep the verification record afterward; Google may check it again.\nURL-prefix properties can use an HTML tag, file, or eligible GA verification, among other methods. Having GA4 does not automatically guarantee verification; the account permissions and tag must meet Google’s requirements. Choose an appropriate method from Google’s ownership verification guide.\n4. Submit the sitemap and inspect individual posts # Hugo generates sitemaps. Start with /sitemap.xml at the site root. A multilingual site may have a sitemap index linking to each language’s sitemap. For this example:\nhttps://blog.yungwei.com/sitemap.xml Open it in a browser first. Confirm it does not return 404 and that its URLs use the production domain. A local production build writes the corresponding public/sitemap.xml; an incorrect baseURL can also produce incorrect URLs in the sitemap.\nIn the Search Console property covering the new URL, open Sitemaps and submit the complete sitemap URL. Check its later fetch status and errors; any language-specific child sitemaps must be accessible too.\nGoogle explains that sitemaps help discover URLs but do not guarantee crawling or indexing. A successful submission means Google can process the list, not that every article is already indexed.\nTo inspect an individual post, paste its production URL into URL Inspection and review Google’s known index status. You can test the live URL and request indexing when needed. New content may take time, without a fixed completion deadline.\nYou can also try searching Google for:\nsite:blog.yungwei.com That is a quick look at some results, not a complete index inventory. Use URL Inspection to examine a particular article.\nIf you are changing domains, also retain the old property, check one-to-one redirects from old posts to new posts, and update canonical URLs and internal links. Use the Change of Address tool when eligible, following Google’s site-move guide. Deleting the old property is not a migration step.\nWe now have instructions for the basic workflow: building locally with Hugo, deploying through GitHub Pages, adding a custom domain, and setting up traffic measurement and search indexing. Next, I will continue with Blowfish layout customization and more advanced Hugo usage.\n","date":"10 Jan 2026","externalUrl":null,"permalink":"/en/posts/self-hosted-website-with-hugo-and-github-pages-part-4/","section":"All Posts","summary":"","title":"Hugo × GitHub Pages – Part 4: Google Analytics and Search Console for Traffic Tracking and Indexing","type":"posts"},{"content":"","date":"10 Jan 2026","externalUrl":null,"permalink":"/en/categories/hugo-self-hosted-website/","section":"Categories","summary":"","title":"Hugo Self-Hosted Website","type":"categories"},{"content":"","date":"10 Jan 2026","externalUrl":null,"permalink":"/en/tags/personal_website/","section":"Tags","summary":"","title":"Personal Website","type":"tags"},{"content":"","date":"30 Dec 2025","externalUrl":null,"permalink":"/en/tags/domain_name/","section":"Tags","summary":"","title":"Domain Name","type":"tags"},{"content":"In Part 2, we put our website, the “house,” on GitHub Pages, the “land.”\n👉 Part 2: First deployment with GitHub Actions\nNow we will give it an address: register a domain with Namecheap, let Cloudflare manage DNS, and connect the Weisblog project site to blog.yungwei.com.\n1. What do domains, DNS, and hosting each do? # A domain name is like a street address: people can find your website without remembering an IP address. DNS resolves where that name points, while hosting provides the actual website files.\nHere is the setup for this guide:\nService Responsibility Example Namecheap Domain registration, renewal, and nameserver settings Own yungwei.com Cloudflare Authoritative DNS and its records Create the blog CNAME GitHub Pages Website files and HTTPS Publish the Weisblog repo Hugo Generate the site and content URLs Set the production baseURL The registrar and DNS provider can be different services. Renewing a domain at Namecheap does not mean its DNS records must be edited there.\nDomain hierarchy # Level Example Purpose Top-level domain (TLD) .com, .io, .org, .tw The rightmost label Registered domain in this example yungwei.com The name you register and renew; yungwei is the second-level label Subdomain blog.yungwei.com Separate services under the same domain You register yungwei.com and can add blog yourself, without buying another domain. We will configure only blog.yungwei.com. The apex yungwei.com and other subdomains can serve different purposes.\nThe project site from Part 2 defaults to https://\u0026lt;username\u0026gt;.github.io/Weisblog/. With a custom domain, visitors use https://blog.yungwei.com/, without /Weisblog/.\nFor me, the value of a custom domain is keeping control of the address I share. I can keep it if I change hosting providers. Preserving search performance also depends on page paths, redirects, and content; buying a domain alone does not guarantee rankings.\n2. Register a domain with Namecheap # This part costs a little, but I think a nice address is worth it. Prices vary by extension, first-year offer, and renewal rate. Check the renewal price before paying, not just the introductory offer.\nSearch for your preferred domain on Namecheap. You can also compare registrars such as GoDaddy and Gandi. yungwei.com is my configuration example; use a name you own or can register.\nCheck availability and add the name to your cart. Skip registration if you already own it. Review the first-year and renewal prices, term, and privacy options you need. You can enable Auto-renew and keep a valid payment method. Still keep track of the expiration date. This GitHub Pages setup does not need an additional hosting package or SSL certificate; Pages provides HTTPS. Keep the order confirmation and complete any contact-verification email required by the registrar. “SSL certificate” remains a common label. Modern HTTPS uses TLS encryption to protect traffic between the browser and website.\n3. Let Cloudflare manage DNS # If Cloudflare already manages your domain and its zone is Active, skip to the next section. Do not reset its nameservers just to repeat the tutorial.\nFor a new setup:\nSign in to Cloudflare, add the whole yungwei.com zone, and choose a suitable plan. Add the apex domain here, not just blog.yungwei.com. Review the scanned or imported records. Preserve existing sites, email MX/TXT records, and other subdomains; the automatic scan may miss records. Note the two nameservers assigned to this zone. They can differ between domains, so do not copy someone else’s values. In Namecheap, open Domain List → your domain’s Manage → Nameservers. Select Custom DNS, enter those Cloudflare nameservers, and save. Wait for Cloudflare to show Active, then manage records in the zone’s DNS → Records. If DNSSEC is already enabled, follow Cloudflare’s full setup instructions to handle the old DS record before switching nameservers, then configure the new DNSSEC setup afterward. An old DS record that does not match the new DNS can prevent the entire domain from resolving. See Namecheap’s nameserver instructions for its interface.\nAfterward, Namecheap handles registration and renewal, while DNS changes belong in Cloudflare. Namecheap’s Advanced DNS is no longer the active place to edit this domain’s records.\n4. Add the custom domain in GitHub Pages first # Open the Weisblog repo on GitHub → Settings → Pages. Enter this under Custom domain:\nblog.yungwei.com Enter only the hostname, without https:// or /Weisblog/. Save it. A pending DNS check is expected at this point because we have not created the record yet. GitHub recommends adding the domain in Pages before pointing DNS to it. You can also verify ownership at the account level first; that is separate from routing the site below.\nAdd the CNAME in Cloudflare # In the yungwei.com zone’s DNS → Records, add:\nField Value Type CNAME Name blog Target \u0026lt;username\u0026gt;.github.io, using your own GitHub username Proxy status DNS only (gray cloud) TTL Auto The CNAME Target is still the account’s \u0026lt;username\u0026gt;.github.io, regardless of the repo name. Do not enter Weisblog.github.io or https://\u0026lt;username\u0026gt;.github.io/Weisblog/. A DNS record has no URL path. GitHub Pages uses its Custom domain setting to select which repository’s site serves that hostname. GitHub’s custom domain documentation explicitly excludes the repository name from this Target.\nThis example uses DNS only, letting GitHub serve the website and HTTPS directly. If blog already has an A, AAAA, or CNAME record, identify its service before resolving the conflict. Leave the apex and other subdomains alone.\nHow do A records and CNAME records differ? # An A record maps a name to an IPv4 address; a CNAME maps a name to another name. It is not a rule that A records are only for the apex or CNAME records only for www.\nOur blog subdomain needs only the CNAME above. If you choose to put the apex domain itself on GitHub Pages, that is a different setup. One option uses GitHub’s four A records:\n185.199.108.153 185.199.109.153 185.199.110.153 185.199.111.153 For that setup, enter your apex domain in Pages and consider www DNS and redirects separately. Do not change yungwei.com’s A records just to configure blog in this guide.\n5. Set Hugo’s URL and check HTTPS # Back in your local Weisblog/, update the existing value in config/_default/hugo.toml:\nbaseURL = \u0026#34;https://blog.yungwei.com/\u0026#34; Keep the trailing /, without /Weisblog/. The Actions workflow in Part 2 builds with the base_url returned by Pages. Its Custom domain and this configuration should agree so canonical URLs, images, and sitemaps use the same address.\nFor manual deployment from Part 2, Pages adds a CNAME file to the publishing branch. Pull that commit first, and add static/CNAME to the Hugo source with one line, blog.yungwei.com, so future builds and syncs preserve it. With a custom Actions deployment, the Pages setting controls the domain and this file is not required.\nPreview the site, review the changes, and push:\ngit add . git commit -m \u0026#34;Set custom domain baseURL\u0026#34; git push With manual deployment, rebuild and sync as described in Method 1 of Part 2 before pushing. Do not push Hugo source directly into the publishing branch.\nBack in Pages, wait for the DNS check and certificate provisioning, then enable Enforce HTTPS. GitHub Pages provides free HTTPS using Let’s Encrypt certificates. DNS and certificate issuance may take time, so the HTTPS option may not be available immediately.\nIf it remains unavailable, check the CNAME Target, gray-cloud status, the Pages domain, and GitHub’s HTTPS troubleshooting instructions. Do not repeatedly remove and re-add settings just because they have not taken effect yet.\nWhen setup is complete, open your production address and check the homepage, posts, images, and language switch. Configuring blog.yungwei.com does not automatically make yungwei.com or www.yungwei.com the same website.\nIf you are moving an existing site to another domain, redirect old article URLs to their matching new URLs and keep slugs and paths where possible. DNS alone does not create HTTP redirects. Part 4 covers search indexing and traffic measurement for the new domain.\n👉 Part 4: Google Analytics and Search Console setup\n","date":"30 Dec 2025","externalUrl":null,"permalink":"/en/posts/self-hosted-website-with-hugo-and-github-pages-part-3/","section":"All Posts","summary":"","title":"Hugo × GitHub Pages – Part 3: Namecheap, Cloudflare DNS, and a Custom GitHub Pages Domain","type":"posts"},{"content":"","date":"28 Dec 2025","externalUrl":null,"permalink":"/en/tags/github_actions/","section":"Tags","summary":"","title":"GitHub Actions","type":"tags"},{"content":"In Part 1, we ran our first Hugo website locally.\n👉 Part 1: Running your first site locally with Hugo\nThis time, we will publish Weisblog/ on GitHub Pages and let GitHub Actions build and deploy it. After that, we can preview a post locally and push it when it is ready.\n1. What is GitHub Pages? # GitHub Pages is GitHub’s static website hosting service. If Hugo’s public/ directory is the house, GitHub Pages is the land it sits on. Free land? Hard to say no to that. XD\n2. Create the Weisblog repo and understand its URL # Create a public repository named Weisblog on GitHub. This is the example name for this guide. Replace every \u0026lt;username\u0026gt; below with your own GitHub username.\nThe default Pages URL depends on the repository name:\nType Repository name Default URL User site \u0026lt;username\u0026gt;.github.io https://\u0026lt;username\u0026gt;.github.io/ Project site Weisblog https://\u0026lt;username\u0026gt;.github.io/Weisblog/ Each account can have one user site, while project sites are configured per repository. We are using a project site, so the repo does not have to be named \u0026lt;username\u0026gt;.github.io. See GitHub’s naming rules.\nWith a custom domain configured, the same project site can serve its content at https://blog.yungwei.com/, without /Weisblog/. We will do that in Part 3; keep these two URL structures separate for now.\nLeave README, license, and .gitignore initialization unchecked when creating the repo. That avoids starting with separate initial histories on GitHub and your computer.\n3. Choose one deployment method # I started by copying public/ manually. Repeating that for every update became tedious, so I switched to GitHub Actions. I recommend going straight to Method 2. Method 1 is here for anyone who wants to understand the publishing steps first.\nMethod 1: Publish the built files manually # With this approach, your local Weisblog/ keeps the Hugo source, while the GitHub Weisblog repo holds only the generated website. Use a separate local folder for the output so you do not mix the two.\nRun these commands from the parent directory beside Weisblog/, replacing the username first:\nmkdir Weisblog-public cd Weisblog-public git init git branch -M main git remote add origin \u0026#34;https://github.com/\u0026lt;username\u0026gt;/Weisblog.git\u0026#34; cd ../Weisblog Set only the posts you intend to publish to draft = false, or draft: false with YAML frontmatter. Keep all other drafts as they are.\nSet the existing baseURL in config/_default/hugo.toml to your project site URL:\nbaseURL = \u0026#34;https://\u0026lt;username\u0026gt;.github.io/Weisblog/\u0026#34; The rsync --delete command below removes files from the output folder when they are no longer present in public/. Its destination must be the new Weisblog-public/ folder, never your source or another project.\nhugo --cleanDestinationDir rsync -av --delete --exclude=\u0026#39;.git/\u0026#39; public/ ../Weisblog-public/ touch ../Weisblog-public/.nojekyll cd ../Weisblog-public git add . git commit -m \u0026#34;Publish Hugo site\u0026#34; git push -u origin main In the repo’s Settings → Pages, choose Deploy from a branch, with main and / (root). The .nojekyll file tells GitHub to serve the static files without treating them as a Jekyll project.\nOnce deployment succeeds, open the URL shown on the Pages screen and check /Weisblog/posts/ and its images. For future updates, repeat the build, sync, and push from the Hugo project.\nIf you choose this method, stop here. Switching to Actions requires replacing the deployment repo’s files with the Hugo source, keeping its .git history and reviewing the differences. Do not continue with the following commands from the output folder.\nMethod 2: Automatic deployment with GitHub Actions # This approach pushes the complete Hugo source project Weisblog/ to the matching repo and lets GitHub build and publish it. There is no need to upload local public/ files. The official Hugo deployment guide follows this process too.\nThese instructions start after Part 1, before pushing anything with Method 1. Create .gitignore in Weisblog/:\npublic/ resources/ .hugo_build.lock .DS_Store We already ran git init while installing the theme. Confirm you are in the Hugo source folder, then connect it to the empty repository:\ngit remote -v git remote add origin \u0026#34;https://github.com/\u0026lt;username\u0026gt;/Weisblog.git\u0026#34; git branch -M main git add . git commit -m \u0026#34;Add Hugo project\u0026#34; git push -u origin main If git remote -v already lists origin, check its destination. Skip remote add if it is correct. Use git remote set-url origin \u0026lt;your-repo-URL\u0026gt; only when you intend to change it.\nOpen the Weisblog repo’s Settings → Pages → Build and deployment and set Source to GitHub Actions. There is no need to run Jekyll first or expect an initial failure as part of setup.\nCreate the workflow file in your local Weisblog/:\nmkdir -p .github/workflows touch .github/workflows/hugo.yaml Save the following in .github/workflows/hugo.yaml. This example pins Hugo 0.168.0, meeting Blowfish’s current minimum requirement. It is not a claim that this version will always be the latest. If your local setup or theme later needs a newer version, update HUGO_VERSION and its download filename, and check the other dependencies against the theme’s requirements. The build time zone is Taipei.\nname: Build and deploy on: push: branches: - main workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: pages cancel-in-progress: false defaults: run: shell: bash jobs: build: runs-on: ubuntu-latest env: DART_SASS_VERSION: 1.97.1 GO_VERSION: 1.25.5 HUGO_VERSION: 0.168.0 NODE_VERSION: 24.12.0 TZ: Asia/Taipei steps: - name: Checkout uses: actions/checkout@v5 with: submodules: recursive fetch-depth: 0 - name: Setup Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} cache: false - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Setup Pages id: pages uses: actions/configure-pages@v5 - name: Create directory for user-specific executable files run: | mkdir -p \u0026#34;${HOME}/.local\u0026#34; - name: Install Dart Sass run: | curl -sLJO \u0026#34;https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz\u0026#34; tar -C \u0026#34;${HOME}/.local\u0026#34; -xf \u0026#34;dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz\u0026#34; rm \u0026#34;dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz\u0026#34; echo \u0026#34;${HOME}/.local/dart-sass\u0026#34; \u0026gt;\u0026gt; \u0026#34;${GITHUB_PATH}\u0026#34; - name: Install Hugo run: | curl -sLJO \u0026#34;https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-amd64.tar.gz\u0026#34; mkdir \u0026#34;${HOME}/.local/hugo\u0026#34; tar -C \u0026#34;${HOME}/.local/hugo\u0026#34; -xf \u0026#34;hugo_${HUGO_VERSION}_linux-amd64.tar.gz\u0026#34; rm \u0026#34;hugo_${HUGO_VERSION}_linux-amd64.tar.gz\u0026#34; echo \u0026#34;${HOME}/.local/hugo\u0026#34; \u0026gt;\u0026gt; \u0026#34;${GITHUB_PATH}\u0026#34; - name: Verify installations run: | echo \u0026#34;Dart Sass: $(sass --version)\u0026#34; echo \u0026#34;Go: $(go version)\u0026#34; echo \u0026#34;Hugo: $(hugo version)\u0026#34; echo \u0026#34;Node.js: $(node --version)\u0026#34; - name: Install Node.js dependencies run: | if [[ -f package-lock.json || -f npm-shrinkwrap.json ]]; then npm ci fi - name: Configure Git run: | git config core.quotepath false - name: Cache restore id: cache-restore uses: actions/cache/restore@v4 with: path: ${{ runner.temp }}/hugo_cache key: hugo-${{ github.run_id }} restore-keys: hugo- - name: Build the site run: | hugo \\ --gc \\ --minify \\ --baseURL \u0026#34;${{ steps.pages.outputs.base_url }}/\u0026#34; \\ --cacheDir \u0026#34;${{ runner.temp }}/hugo_cache\u0026#34; - name: Cache save id: cache-save uses: actions/cache/save@v4 with: path: ${{ runner.temp }}/hugo_cache key: ${{ steps.cache-restore.outputs.cache-primary-key }} - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: ./public deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 Yes, it is long. XD Start with the main steps: Checkout includes the theme submodule, Build creates public/, Upload transfers the output, and Deploy publishes it. --baseURL uses the URL returned by Pages, so it follows either the project site or Custom domain setting.\nAlso update the existing baseURL in config/_default/hugo.toml so local production builds use the correct address. Edit the existing key instead of adding a duplicate. Before configuring a custom domain, use:\nbaseURL = \u0026#34;https://\u0026lt;username\u0026gt;.github.io/Weisblog/\u0026#34; [caches] [caches.images] dir = \u0026#39;:cacheDir/images\u0026#39; caches.images stores Hugo image-processing results, so operations such as Resize, Fit, and Fill do not have to start over each time. The workflow’s Cache restore/save steps share that cache between Actions runs.\nSet posts intended for publication to draft: false (draft = false in TOML), keeping other drafts unchanged. Preview public content with hugo server; add -D only when you need to inspect drafts. The production workflow does not use -D.\nThen push:\ngit add . git commit -m \u0026#34;Add Pages deployment workflow\u0026#34; git push Check that both build and deploy succeed in Actions, then open the URL provided by Pages. A green checkmark means the workflow completed. You still need to check pages, navigation, and images yourself; the workflow cannot judge whether the writing is correct.\nFor later updates, preview locally, review what you are committing, and push. If the URL includes /Weisblog/, article and asset links must keep that prefix too. Hugo’s relURL/relref can generate links in templates and content; hard-coding /posts/ would instead point to the account’s root site.\nTroubleshooting # I once had GitHub reject a workflow push because my classic token lacked the workflow scope:\nrefusing to allow a Personal Access Token to create or update workflow .github/workflows/hugo.yaml without workflow scope If you use HTTPS with a classic token, check its repo and workflow scopes under GitHub personal Settings → Developer settings → Personal access tokens. With a fine-grained token, check Contents and Workflows write access for the target repo. A rejected push is different from an Actions build failure; first identify where it failed.\nIf macOS keeps using an old credential, find the matching account’s github.com entry in Keychain Access and update it before pushing again. I have also used security delete-internet-password -s github.com to clear an old credential. With multiple accounts, identify the right entry in Keychain first. The complete token is shown only once; store it and do not put it in the repo.\n4. Use your own domain # You now have a site at https://\u0026lt;username\u0026gt;.github.io/Weisblog/. Next, we will connect it to blog.yungwei.com, using Was Wei weiß as the site name. The address is a configuration example; substitute a domain you own.\n👉 Part 3: Namecheap registration, Cloudflare DNS, and a custom GitHub Pages domain\nWhat if I change hosting providers later? # Keep the Markdown and images, then adjust the deployment workflow, baseURL, and DNS. If the new host builds the site itself, disable only this Pages workflow; do not delete the entire .github/workflows/ directory, which may contain other jobs. If URLs or paths change too, old links need redirects and search indexing needs attention. Part 3 and Part 4 cover those next.\n","date":"28 Dec 2025","externalUrl":null,"permalink":"/en/posts/self-hosted-website-with-hugo-and-github-pages-part-2/","section":"All Posts","summary":"","title":"Hugo × GitHub Pages – Part 2: First Deployment with GitHub Actions","type":"posts"},{"content":"During my graduate studies, I focused on research in Computer Vision. During that time, I accumulated many ideas and notes, gradually developing the habit of documenting my learning process and thought flow.\nI later spent a semester as an exchange student at Technical University of Munich (TUM) in Germany. While it was officially an academic exchange, my goal was to travel, explore different countries, and broaden my perspective. During my time in Germany, I not only filmed travel vlogs but also documented my exchange experience and reflections in writing.\nI am currently working as a Digital Design Engineer at MediaTek. Hoping to continue learning and improving outside of work—and to share that process—I created this website, with the intention of writing consistently over the long term.\nI see this website as a starting point for everything: a place to look back on the past and to look ahead to the future. The content here spans technical tools, note-taking practices, and workflows, as well as learning records from different stages of my life. These notes may not be complete, nor do they always lead to clear conclusions; they are simply my attempts to organize and understand the things I encounter at different moments in time.\n","date":"28 Dec 2025","externalUrl":null,"permalink":"/en/about/","section":"Was Wei weiß","summary":"","title":"About","type":"page"},{"content":"In the previous article, I talked about the basic ideas behind building a static website.\n👉 Hugo × GitHub Pages – Part 0: Core Concepts and Website Building Blocks\nIn this article, we will create a Hugo project, set up a theme, and build our very first Markdown-based webpage locally.\n1. What Is Hugo? # Hugo is a static site generator (SSG) that converts your written Markdown content into a complete website consisting of HTML, CSS, and JavaScript files that can be directly published online.\nMarkdown content + theme + configuration ↓ Hugo builds ↓ A complete static website (HTML / CSS / JS) On the official Hugo website, Hugo describes itself with this line:\nThe world’s fastest framework for building websites\nHonestly, when I first saw this, my immediate reaction was:\nThat’s a bold claim.\nBut after actually using it, you’ll realize this isn’t just marketing language.\nHugo’s biggest strengths are that it is fast, simple, and does not rely on a heavy frontend ecosystem.\nHugo itself is a single executable and does not require Node.js to run. If your theme uses npm, Go modules, or a separate Sass tool, install those dependencies as its documentation requires. Once the content and configuration are ready, Hugo can quickly generate the site.\nCompared to tools like Hexo or Jekyll, which require additional runtime environments, Hugo is much simpler to install and maintain, with very few dependency-related issues.\n2. Creating a Local Website with Hugo # I’m using macOS in this guide. For Windows users, please refer to the official documentation.\n(1) Prerequisites # We’ll use Homebrew to install Hugo. If you’ve never used Homebrew before, install it first by opening Terminal and running:\n/bin/bash -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\u0026#34; brew update \u0026amp;\u0026amp; brew upgrade \u0026amp;\u0026amp; brew cleanup Install Git and Go for version control and any modules used by the theme (if Git is new to you, the later steps may take more effort):\nbrew install git go Install Hugo:\nbrew install hugo Run hugo version to check the installation. The output below is what I originally saw, using an older version. For a fresh installation of Blowfish, check its minimum requirement first, currently Hugo 0.162.0. Do not use the old version shown below as your installation target:\nhugo version hugo v0.152.2+extended+withdeploy darwin/arm64 BuildDate=2025-10-24T15:31:49Z VendorInfo=brew (2) Create a Hugo Project # This series uses Weisblog for the local project folder and the GitHub repository we will create later. The site title is Was Wei weiß. You can choose your own name, but use it consistently in the paths that follow.\nCreate a new project using hugo new site \u0026lt;project-name\u0026gt;:\nhugo new site Weisblog cd Weisblog You should now see the following directory structure:\nWeisblog/ |--- archetypes/ |--- assets/ |--- content/ # Markdown pages and posts |--- data/ |--- i18n/ |--- layouts/ |--- static/ |--- themes/ # Themes are stored here |--- hugo.toml # Main configuration file We’ll go into more detail about these directories and advanced Hugo settings later. For now, just remember:\nThemes live under themes/ Pages and posts (Markdown files) live under content/ Download a Hugo Theme # Before the site can render properly, we need to choose a theme. You can browse available themes on Hugo Themes. Popular choices include PaperMod, Stack, and Blowfish.\nI personally use Blowfish. You can preview it on their Demo Page.\nYou can further customize the theme later to create your own visual style. If you’re not sure which one to choose, Blowfish is a solid starting point. I plan to write a dedicated article about its customization options in the future.\nBelow, I’ll use Blowfish as an example. The installation process is similar for most themes, but it’s always recommended to follow the theme’s official documentation. The Blowfish Installation Guide is particularly clear.\nInside the Weisblog/ directory, run:\ngit init git submodule add -b main https://github.com/nunocoracao/blowfish.git themes/blowfish # Use this command in the future to update the theme # git submodule update --remote --merge Next:\nrm hugo.toml # Remove Hugo’s default config file cp -r themes/blowfish/config config This creates a new config/ directory. Open config/_default/hugo.toml and uncomment the following line (not the one under themes/blowfish/config/_default/):\ntheme = \u0026#34;blowfish\u0026#34; Next, open the copied config/_default/languages.en.toml in your project and change its existing title to your site name. Check any other enabled language files as well so they do not keep the theme’s sample title.\ntitle = \u0026#34;Was Wei weiß\u0026#34; The local preview screenshots below show the Blowfish defaults; the heading will change with your settings.\nCreate Your First Post # Now let’s create our first post using hugo new content \u0026lt;path\u0026gt;:\nhugo new content posts/my-first-post.md The new file will appear under the content/ directory.\nInside the file, you’ll see metadata wrapped in +++. We’ll explain this in more detail later. For now, let’s simply write some Markdown content (If you’ve never written Markdown before, you can ask ChatGPT to generate a sample, and there are also plenty of resources available online). For example:\n+++ date = \u0026#39;2025-12-20T17:21:59+08:00\u0026#39; draft = true title = \u0026#39;My First Post\u0026#39; +++ # Hello world This is my first post. Now let’s see what the site looks like.\n(3) Local Preview # At this stage, we can start building and previewing the site. Here are the three most important Hugo commands:\nCommand Purpose What It Does Common Use Case hugo Production build Generates the full static site into public/ Before deployment, GitHub Actions hugo server Local development Starts a local server with live reload Writing content, layout tweaking hugo server -D Preview drafts Includes draft = true content Reviewing unpublished posts Since our post is marked as draft = true, we need to run:\nhugo server -D hugo server provides the live preview. Running hugo produces the complete static website under public/ for deployment in the next article.\nBased on the output, open the local URL in your browser—usually http://localhost:1313/:\nWeb Server is available at http://localhost:1313/ (bind address 127.0.0.1) Because our post is under content/posts/, navigating to http://localhost:1313/posts/ will show the newly created article.\nTry editing the post and saving the file—you’ll see the preview update instantly, which makes writing extremely convenient.\nIn the next article, we’ll complete the first real deployment, automatically deploying the Hugo site to GitHub Pages.\n👉 Hugo × GitHub Pages – Part 2: First Deployment with GitHub Actions\n","date":"27 Dec 2025","externalUrl":null,"permalink":"/en/posts/self-hosted-website-with-hugo-and-github-pages-part-1/","section":"All Posts","summary":"","title":"Hugo × GitHub Pages – Part 1: Running Your First Site Locally with Hugo","type":"posts"},{"content":"The very first post on my personal website goes to a “how to build a website” guide 🙂\n1. Why Build a Personal Website Yourself? # When it comes to writing online, the first platforms that usually come to mind are ready-made publishing platforms such as Medium, Vocus, and Matters.\nThese platforms have very clear advantages:\nThey take care of layout, hosting, and even basic SEO configuration for you. As a creator, you can focus almost entirely on writing content, with very little technical barrier to entry.\nHowever, the drawbacks are just as clear: you are completely dependent on the platform.\nTake Medium as an example. In recent years, many creators have noticed that article SEO performance has weakened, with decreasing visibility on Google search results. I personally experienced this as well—even when searching with relevant keywords, I couldn’t find articles I had written myself. Your content exists on the platform, but it doesn’t necessarily belong to you, nor is it guaranteed to be properly indexed or surfaced by search engines.\nAs I started thinking about long-term writing, one thing became increasingly clear:\nWhat I want is a website that truly belongs to me, not just an account under someone else’s platform.\nThat’s why I decided to invest some upfront time into learning how to build my own website. While it does take extra effort at the beginning to understand the tools and workflow, once the structure is in place, I can return to focusing purely on writing. More importantly, the content, URLs, and presentation are all fully under my own control.\n2. Most People Only Need a “Static Website” # When people hear “building your own website,” their first reaction is often:\nDo I need to run a server?\nDo I need to write backend code?\nIsn’t that complicated?\nIn reality, most personal websites don’t need to be dynamic at all.\nSimply put:\nCategory Dynamic Websites Static Websites Request handling Each request requires backend processing Content is pre-generated (HTML / CSS / JS) System requirements Databases, servers, user systems Browser directly loads files Performance \u0026amp; maintenance More complex, higher maintenance cost Fast, stable, secure, low cost Typical use cases E-commerce, social platforms, online systems Blogs, personal sites, portfolios Target users Services requiring real-time interaction Content-focused creators For a personal website centered around written content, static websites are not only sufficient—they are often the better choice. They are easier to deploy, faster, more stable, and cheaper to maintain.\nWhat I want to build is not a complex system, but a clean, long-term maintainable static website.\n3. Website Building Can Be Reduced to Three Layers (Core Concept) # Before diving in, I spent some time clarifying the role of each tool. In the end, I broke the entire website-building process into three layers:\nThe Three-Layer Website Model # Content Layer: Markdown Responsible for the content itself. Platform-independent and the most valuable long-term asset. Generation Layer: Hugo Converts Markdown into a real website (HTML / CSS / JS) and manages site structure and styling. Deployment Layer: GitHub Pages Hosts the generated static site online and provides HTTPS and domain access. Why Markdown?\nMarkdown is one of the most platform-independent content formats available. My own note-taking system in Obsidian is also built entirely around Markdown.\nWhy Hugo?\nThere are other tools similar to Hugo, such as Jekyll and Hexo. Hugo stands out because:\nIts configuration and directory structure are relatively intuitive It does not require a JavaScript-heavy ecosystem It is extremely fast, making it ideal for frequent writing and previewing Why GitHub Pages?\nMore than sufficient for static websites Free, stable, and HTTPS-enabled Naturally integrates with Git-based version control workflows Without the need for a backend or complex functionality, GitHub Pages is a low-risk, low-cost choice.\nOnce the roles of each layer and tool are clear, it’s time to start building. The following articles in this series will walk through the entire process step by step, turning this structure into a working website.\nIn the next post, we’ll start from the very basics and run our first Markdown-powered site locally using Hugo.\n👉 Hugo × GitHub Pages – Part 1: Running Your First Site Locally with Hugo\n","date":"27 Dec 2025","externalUrl":null,"permalink":"/en/posts/self-hosted-website-with-hugo-and-github-pages-part-0/","section":"All Posts","summary":"","title":"Hugo × GitHub Pages – Part 0: Core Concepts and Website Building Blocks","type":"posts"},{"content":"🔄 Updated Information (New Policy as of February 2025):\nAccording to the latest regulations introduced in February 2025, student visa applications can now be submitted online up to six months before departure. There is no longer a need to compete for in-person appointment slots.\nAfter the documents are reviewed and approved, the system will assign an appointment time. Applicants only need to visit in person to provide fingerprints, submit passport photos, and pay the visa fee.\n📌 Official announcement: German Institute Taipei – Latest Visa Information (2025)\n📌 Further reading (regularly updated): German Long-Term Visa Guide | Required Documents, Timeline \u0026amp; 2025 Policy Changes\nThe following section shares the previous application process (January 2025 version). While the booking system has changed, the required documents and on-site procedures remain largely relevant for reference.\nGerman exchange students typically stay for at least one semester. If the duration exceeds 90 days, a student visa is required. Based on practical experience, this guide outlines the application process for an exchange student visa in four main stages:\nBooking an Appointment with the German Institute Completing the Online Application Form Preparing the Required Documents On-Site Application Process 💡 Note: If you are a degree-seeking student, the document requirements may differ slightly. Please refer to the official information page.\nApplying for a German Exchange Student Visa # 1. Booking an Appointment with the German Institute # Update: As of February 2025, there is no longer a need to compete for appointment slots. However, it is still recommended to upload your documents online as early as possible.\nPreviously, applying for a student visa required securing an appointment slot through the German Institute’s website — and these slots were notoriously difficult to obtain. It often required refreshing the page frequently to catch newly released time slots.\nIn my case, the semester at TUM started on April 1. According to the regulations at the time, the earliest possible appointment date was within three months before the semester began, meaning appointments opened starting January 1. I began closely monitoring the German Institute’s website in early December. Together with several classmates who were also admitted to TUM, we emailed the Institute to ask whether group appointments were possible. However, we received a reply stating that group appointments were not available that year, so we had to book individually.\nFortunately, on the afternoon of December 6, I managed to secure a January slot that had just been released and successfully booked an appointment for January 13 (Monday). After completing the booking, a confirmation email was sent containing a link. It is essential to click the link to confirm the appointment in order to officially secure the slot.\n2. Completing the Online Application Form # The German long-term visa application form must be completed online through the official website: VIDEX Online Application System.\nThe form is relatively detailed and can feel lengthy, so it is recommended to set aside a dedicated block of time to complete it. The good news is that the system allows you to save a draft and import it later to continue editing, which makes the process much more manageable.\nWhen filling out the form, I referred to online guides step by step. The following two resources were particularly helpful — using them side by side should make the process much smoother:\nGerman Exchange Student Visa | Required Documents \u0026amp; 2024 Application Form Guide – Yun’s Dailyyyy German Long-Term Visa Application Form 2025 | Detailed Bilingual Guide – Willstudy 📌 Tip: If you do not yet have a German residential address at the time of application, you may temporarily use the address of your host university’s International Office.\n3. Preparing the Required Documents # Update: As of February 2025, documents are uploaded online in advance. However, hard copies must still be brought on the appointment day for verification.\nBelow is the list of documents required for an exchange student visa application:\nOriginal valid passport (signed, with at least two blank pages), 1 copy Photocopy of the passport bio-data page, 1 copy Printed online application form (completed via VIDEX), 1 copy Two passport-sized photos (taken within the last three months) Admission Letter, 1 copy Certificate of Enrollment in English¹, 1 copy Academic Transcript in English, 1 copy Proof of Financial Resources², 1 copy Motivation Letter (in German or English)³, 1 copy Incoming Insurance certificate (travel/entry insurance)⁴, 1 copy Visa fee: €75 (card payment is usually accepted, but bringing cash is recommended) Note ¹: Exchange students are not required to submit language proficiency certificates or degree diplomas. An English certificate of enrollment and an English academic transcript issued by the home university are sufficient.\nNote ²: Proof of financial resources can be provided through the Expatrio Document 06 (Blocked Account Confirmation). It is advisable to apply as soon as the Admission Letter is received. Note ³: The motivation letter can briefly explain the reasons for applying for the exchange program and how the experience will benefit future academic or career development.\nNote ⁴: The incoming insurance (travel/entry insurance) is required specifically for the visa application and is different from the German public health insurance (e.g., TK) used after enrollment (April 1). It can be obtained during the Expatrio application process.\n4. On-Site Application Process # My visa appointment was scheduled for January 13 (Monday). It is recommended to arrive about 30 minutes early. The process was as follows:\nAt the visitor kiosk on the first floor of Taipei 101, use the intercom to contact the German Institute on the 33rd floor and obtain a visitor pass. Take the elevator to the 35th-floor transfer level, then go down to the 33rd floor. Upon entering, security will collect your phone and ask you to place your belongings in a locker. You will be asked to prepare your application documents, passport, photos, and wallet. Inside, there is a posted guide showing the required document order, which you can follow to arrange your paperwork on the spot. If there are no applicants ahead of you, your number may be called earlier than scheduled. The entire process takes approximately 10–15 minutes. On that day, I interacted with two staff members (one male and one female). The female officer was relatively friendly, while the male officer was more formal and reserved.\nMy On-Site Experience (Conducted Entirely in Chinese):\nI submitted my documents and passport to the officer. He first verified my personal information and asked about my purpose of travel (I was asked which TUM campus I would attend). I then paid the visa fee of €75 (approximately NT$2,560 at the time). Bringing cash is recommended. I signed the courier slip and other required documents on site (if the application form was unsigned, you will be asked to sign it there). Finally, fingerprints were taken, and I received a receipt for the visa application. I also asked about the possibility of temporarily borrowing my passport, as I had travel plans in early February and was concerned about not receiving it in time. The officer replied that passports are typically returned within two to three weeks and suggested waiting to see if it would arrive before applying for a temporary withdrawal.\nAfterward:\nThe result was surprisingly fast — I received my visa and passport just one week later (January 20)! (Possibly because it was not peak season.)\nThe passport was returned via courier, so be prepared to pay the delivery fee upon receipt.\nThe visa start date issued was March 1, which matched the date I had requested. Although the semester began on April 1, the officer had mentioned that an earlier start date could not be guaranteed. The final approval date may have been influenced by:\nListing March 1 as my intended date of entry on the application form; Transferring seven months of living expenses through Expatrio instead of six, covering March through the end of September. Since I received my visa before my scheduled trip abroad, I ultimately did not need to apply for temporary passport withdrawal. If you anticipate a similar situation, you may refer to this detailed guide: German Student Visa – Temporary Passport Withdrawal Guide | Application \u0026amp; Return Process\n✈️ I hope this guide helps you better understand the visa application process and prepares you for a smooth journey to Germany!\nReference Links # (2025 Latest) Complete Guide to German Long-Term Visas | Document Checklist, Timeline \u0026amp; 2025 Policy Changes 2023 German Student Visa Appointment \u0026amp; Application Process — Full Record! 🇩🇪 2023 German Exchange Student | Long-Term Visa Application Experience Share ","date":"20 Jul 2025","externalUrl":null,"permalink":"/en/posts/germany-exchange-student-visa-application-guide/","section":"All Posts","summary":"","title":"German Exchange Student Visa Guide | Documents \u0026 Application Process","type":"posts"},{"content":"","date":"20 Jul 2025","externalUrl":null,"permalink":"/en/tags/german_visa/","section":"Tags","summary":"","title":"German Visa","type":"tags"},{"content":"Based on my exchange experience at the Technical University of Munich (TUM), Summer Semester 2025 | Updated for 2025\nGetting accepted as an exchange student was incredibly exciting. But what I didn’t expect was that the real challenge actually begins after the acceptance.\nUsing my exchange at the Technical University of Munich (TUM) in Germany as an example, after passing the internal selection process at National Taiwan University (NTU), there was a long waiting period. German universities typically do not receive official nominations from partner institutions until early October, so there’s no need to rush into preparing documents before that.\nHowever, once October arrives and you receive the nomination confirmation from the German university, everything starts moving quickly. You’ll need to upload application documents, complete registration, apply for a visa, arrange accommodation, choose insurance, book flights, and more.\nThe German process can feel bureaucratic and sometimes requires early planning. Certain steps must be secured in advance—visa appointments cannot be booked too late, insurance decisions must be made early, and missing deadlines can quickly become stressful.\nAt the time, I searched through countless blog posts and forums to piece together the process step by step, yet the information always felt scattered.\nTo help future exchange students heading to Germany avoid unnecessary confusion, I’ve organized the entire journey into a time-based series of five articles:\n(Links coming soon)\n(1) Pre-Departure Checklist (you’re reading this now) (2) Packing List Guide (what to bring from Taiwan vs. buy in Germany) (3) What to Do After Arriving in Germany (Administrative Matters) (residence registration, public insurance, blocked account activation) (3) What to Do After Arriving in Germany (Daily Life) (mobile plan, online banking account, monthly transport pass, daily shopping) (3) What to Do After Arriving in Germany (TUM University Guide) (timeline specifically for Technical University of Munich) (4) Useful Apps for Daily Life (transportation, living, language learning) (5) Before Leaving Germany (lease termination, insurance cancellation, dormitory deposit refund, and preparations for returning home) Although this guide applies to most exchange students going to Germany, I’ve also added specific notes based on my experience at TUM. If you’re heading there as well, this series will be especially helpful.\n▲ Neuschwanstein Castle, Germany (Photo taken on March 14, 2025) 🗓 My Pre-Departure Timeline Overview (For Reference Only) # Below is my complete preparation timeline, starting from passing NTU’s internal selection to my actual departure.\nTUM’s semester officially begins on April 1, and most students depart in late March or early April. My departure date was slightly earlier (March 10) because I chose to travel in Europe beforehand. However, the overall sequence and process remain applicable to most students.\n📍 Nomination \u0026amp; Application Phase (Starting October 2024) # In October, NTU completed the nomination to partner universities. From there, the application process depended on each host university. Below is my TUM timeline:\nDate Event Notes Oct 4 NTU completed nomination Waited about two weeks for confirmation Oct 7 Received TUM nomination confirmation Included application instructions, deadline Oct 31 Oct 21 Completed online TUM application \u0026amp; submitted forms¹ Uploaded required documents² and indicated housing preference³ Oct 22 Received confirmation of application Waiting for Admission Letter (early December) Oct 31 Application deadline Note ¹: When sending documents back to TUM, remember to CC the NTU Europe exchange coordinator so both sides can track your progress.\nNote ²: Required documents included: CV, study plan, motivation letter, language certificate, passport copy, undergraduate transcript, (graduate transcript if applicable), and (degree certificate if applicable).\nNote ³: For TUM, student housing application only required indicating your housing preference in the system. Some universities allocate housing based on application order—apply early if that’s the case. If not assigned housing, Facebook groups (e.g., Taiwanese students in Munich) can help, but always beware of scams.\n📍 Visa \u0026amp; Enrollment Phase (Starting December 2024) # Once December begins, Admission Letters are issued. This marks the start of visa application and university enrollment.\nI recommend organizing tasks into three categories:\n1️⃣ Visa (appointment booking, application forms, required documents) 👉 German Exchange Student Visa Guide | Documents \u0026amp; Application Process\n2️⃣ Enrollment (semester fee payment)\n3️⃣ Blocked account \u0026amp; insurance (e.g., Expatrio package) Date Event Notes 12/2 Received Admission Letter Includes registration instructions¹; registration deadline: 1/10 12/2 NTU Exchange Workshop Pre-departure briefing and sharing session by senior students 12/6 Visa Appointment Confirmed (German Institute: 1/13) Appointment scheduled within three months before semester start² 12/19 Applied for Expatrio Value Package Includes blocked account and insurance 12/20 Paid Semester Fee³ 12/23 Transferred Funds to Blocked Account Includes €992 monthly living expenses 12/23 Expatrio Deposit Confirmed; Received Document 06 Used as financial proof for visa 12/25 Uploaded ID Photo to TUMonline 1/10 TUM Registration Deadline 1/13 Visa Appointment at the German Institute 1/14 Received Registration Confirmation Email⁴ 1/20 Received Visa Issued within one week — unexpectedly efficient 1/21 Booked Flight⁵ Checked student fares and compared prices via Skyscanner Note ¹: After receiving the Admission Letter, forward a copy to the NTU coordinator responsible for Europe. Then complete the following three tasks:\nPay the semester fee (€85). (You can check the payment status in TUMonline after transferring.) Upload proof of German health insurance. (If you use Expatrio, the system will automatically notify the university — no manual upload required.) Upload your ID photo to TUMonline. No confirmation email will be sent after completing these steps. You will need to wait until after the deadline to receive the official Registration Confirmation Email.\nNote ²: Visa appointments at the German Institute must be scheduled within three months before the semester begins. In my case, since the semester started on April 1, the earliest possible appointment date was January 1. Appointments can usually be booked starting in early December.\nInitially, I tried to arrange a group appointment together with other students admitted to TUM, but the German Institute replied that group applications were not available this year, so we switched to individual appointments.\nUpdate: As of February 2025, there is no longer a need to compete for appointment slots. Please refer to this article.\nNote ³: International bank wire transfer fees are expensive. For example, transferring money via Bank SinoPac may incur a fee of around NT$1,350, which is not cost-effective for small amounts.\nThe best solution is to ask a friend who is already in Germany to transfer the money for you. I asked a senior student in Germany to transfer the payment via Revolut and included my student ID number (Matrikelnummer) in the reference.\nNote ⁴: After receiving the Registration Confirmation Email, you can access more features in TUMonline and obtain your TUM ID.\nGo to: TUMonline → Admission → Documents to download your Certificate of Enrollment.\nAs for course registration, you can wait until late March to handle it. Note ⁵: You can consider booking your flight as soon as you receive the Admission Letter. However, I chose to purchase my ticket only after receiving my visa, which felt like a safer option.\n📍 Housing Payment \u0026amp; Revolut Setup (Starting February 2025) # After completing registration and securing the visa, the final countdown before departure begins. During this period, students will gradually receive dormitory allocation notices and confirm rent and deposit details. Once a German address is available, it is also possible to start setting up essential tools for daily life, such as online banking (e.g., Revolut).\nBelow is a timeline of the tasks I handled between February and March before departure.\nDate Event Notes 1/17 Received Dormitory Room Confirmation¹ Rent and address not yet confirmed 2/6 Applied for Overseas Travel Permit (Military Service) Apply 30–60 days before departure, according to school instructions 2/12 Received Accommodation Offer Rent confirmed²; payment and signed documents due within one week 2/17 Transferred Dormitory Payment; Submitted Signed Documents and Wire Proof Full amount received 2/18 Dormitory Confirmed Payment 2/20 Received Tenancy Agreement Includes official address; must be signed and returned 2/22 Opened Revolut Account³ Can apply after obtaining visa and German address 2/27 Received Fully Signed Tenancy Agreement from Dormitory Required for key collection 2/28 Applied Online for Dubai Transit Visa⁴ Can be issued the same day; fee: $24.92 USD 3/9 Booked Residence Registration Appointment (Termin) for 4/8⁵ Can also book 1–2 weeks before moving into the dorm 3/10 ✈️ Departed for Germany My exchange journey officially begins Note ¹: The dormitory confirmation email does not always include detailed room information. I didn’t know the room type until I actually moved in. In my case, I was assigned to an 8-person WG (shared kitchen) with a private bathroom. The room was furnished with a bed, mattress, desk, chair, and wardrobe.\nThe Service Package included a sleeping bag, pillow, pillowcase, and bedsheet. Only an Ethernet port was provided in the room, so it is recommended to bring an Ethernet cable and a Wi-Fi router. 👉 Exchange Student Packing List\nNote ²: The monthly rent was €391.5, with a €430 deposit. A total of three months’ rent plus the deposit had to be paid upfront, amounting to €1604.5.\nNote ³: Revolut is commonly used as a digital banking solution in Germany. Opening an account requires completing a video identity verification and providing a German address and a valid visa. Note ⁴: I flew with Emirates and had an approximately 10-hour layover in Dubai. For those wishing to enter the UAE during transit, a 48-hour transit visa can be applied for through the airline’s website within one month before departure. I applied and received approval on the same day. The fee was $24.92 USD.\nFor a detailed application guide, refer to: this article.\nNote ⁵: In Germany, residence registration (Anmeldung) must officially be completed within two weeks of arrival. However, the required document is the Wohnungsgeberbestätigung (landlord confirmation of residence), not the Tenancy Agreement. This document can only be obtained after moving in.\nIf arriving early while the lease starts later (e.g., April 1), registration cannot be completed immediately. In practice, this situation does not typically result in penalties. Since appointment slots are limited, it is advisable to book a registration appointment online one to two weeks before moving into the dormitory. 👉 What to Do After Arriving in Germany (Administrative Matters)\n📎 Additional Reminders (Fraenk Mobile Plan Recommendation) # Having reliable internet access abroad is extremely important. I initially purchased a European travel eSIM and only applied for a local German mobile plan after arriving in Germany. Later, however, I realized that as long as you have a Revolut account, you can actually apply for a German mobile plan directly — which means you could (most likely) complete the application before departure.\nI recommend using Fraenk, a convenient and affordable German mobile service. The entire process is handled through the app — there’s no need to visit a physical store, and everything can be completed online:\nThe Fraenk app must be downloaded from the German App Store (it’s recommended to create a German Apple ID or switch your App Store region). Although the interface is in German, the process is intuitive and can be completed by following online tutorials. Fraenk supports roaming in most European countries, which is especially convenient for exchange students who plan to use their study period as a chance to travel around Europe. 💡 When signing up, you can enter my referral code: YUNF5. Both of us will receive an extra 5GB of data per month, which makes the plan even more cost-effective.\nFinally, there are a few additional small but practical preparations worth taking care of in advance to avoid last-minute stress:\nPrepare an international credit card (a dual-currency card is recommended). Exchange some euros in cash (at least €300 is advisable; after receiving your physical Revolut card in Germany, you can withdraw more if needed). Apply for an International Driving Permit (IDP) if you plan to drive while traveling in Europe. Although these may not be part of the “main quest” in the application process, they can make your exchange journey much smoother and more reassuring.\n","date":"19 Jul 2025","externalUrl":null,"permalink":"/en/posts/exchange-student-survival-guide-1-before-departure/","section":"All Posts","summary":"","title":"🇩🇪 Exchange Student Survival Guide – Part 1: Pre-Departure Checklist","type":"posts"},{"content":"","date":"19 Jul 2025","externalUrl":null,"permalink":"/en/tags/fraenk/","section":"Tags","summary":"","title":"Fraenk","type":"tags"},{"content":"","date":"19 Jul 2025","externalUrl":null,"permalink":"/en/tags/revolut/","section":"Tags","summary":"","title":"Revolut","type":"tags"},{"content":"","date":"19 Jul 2025","externalUrl":null,"permalink":"/en/tags/tum/","section":"Tags","summary":"","title":"TUM","type":"tags"},{"content":"","date":"27 Jun 2025","externalUrl":null,"permalink":"/en/tags/doctolib/","section":"Tags","summary":"","title":"Doctolib","type":"tags"},{"content":"","date":"27 Jun 2025","externalUrl":null,"permalink":"/en/tags/german_public_insurance/","section":"Tags","summary":"","title":"German Public Insurance","type":"tags"},{"content":"Studying or participating in an exchange program in Germany requires health insurance (Krankenkasse), which is mandatory. Whether public or private, every student must be insured. Coverage and additional benefits may vary slightly between providers.\nTaking Techniker Krankenkasse (TK) as an example, beyond basic medical coverage, it also includes benefits such as vaccinations and dental check-ups. One of the most surprising perks is that the HPV vaccine can be fully covered at no additional cost.\nThe monthly premium for TK is approximately €144, which is admittedly not inexpensive. Since such a substantial contribution is already being paid, it makes sense to make full use of the available benefits. Moreover, the HPV vaccine is fully self-funded in Taiwan. For instance, the nine-valent vaccine costs around NT$5,400 to 7,000 per dose, and completing the full three-dose series can be quite costly.\n💉 Who Is Eligible for Free Vaccination? # If you are under 26 years old, regardless of gender, and insured under a major public health insurance provider (such as TK or DAK), the full cost of the HPV vaccine can be reimbursed. This benefit is particularly valuable for international students and young professionals.\n💡 Germany vs. Taiwan: HPV Vaccine Cost Comparison (Nine-Valent Vaccine) # Region Price per Dose Total for 3 Doses Covered by Public Insurance Taiwan NT$5,400–7,000 NT$16,200–21,000 ❌ Fully self-funded Germany (Public) €0 €0 ✅ Fully reimbursed (under 26) 📋 Overview of the HPV Vaccination Process (From Appointment to Reimbursement) # Below is a complete overview of the HPV vaccination process. Each step will be explained in detail in the following sections:\n(Click to jump to a specific section)\nBook a General Practitioner (Recommended: Doctolib) Attend the Appointment Apply for Reimbursement from TK Don’t worry — even if you don’t speak German at all, you can still complete the entire process smoothly!\n🧭 1. Book a General Practitioner (Recommended: Doctolib) # There are several ways to book a Hausarzt (general practitioner). If you can communicate in German, you may call or email clinics directly, or use TK’s Doctor Search Page to find clinics near your residence. However, these platforms are mostly in German, which may feel overwhelming for newcomers.\nFrom personal experience, the most convenient and beginner-friendly method is using Doctolib. This is one of the most widely used medical booking platforms in Germany. Both the website and the app support English, and the interface is clear and intuitive.\nYou can filter by city or postal code, check the languages spoken at each clinic (some doctors indicate English proficiency), and select a nearby clinic with available time slots.\n👉 Important reminder: Although both general practitioners (Hausarzt) and gynecologists (Frauenarzt) can administer the HPV vaccine, not every clinic offers this service. Some may refer you elsewhere. When booking through Doctolib, select “HPV vaccination” directly as the appointment type to filter clinics that actually provide the service.\n📱 Step-by-Step via Mobile App # Download Doctolib and create an account: After logging in, you can switch the language to English in the settings.\nSearch for “HPV vaccination” on the homepage.\nChoose your location: Enter your city or postal code manually, or tap “Near me” to enable location services.\nUse the filters at the top:\nAvailability – Find the earliest open time slots Insurance type – Keep “Public insurance” selected ✅ Spoken languages – Select English if preferred Select a clinic and click “Book an appointment”: Choose Public insurance if insured under TK, DAK, etc. Select appointment reason: This varies by clinic. I selected “Vaccination consultation”\nChoose a time slot and confirm: Click Confirm appointment to complete the booking.\n📌 After booking, Doctolib will send a confirmation email, and you can view your appointment anytime in the app. Just arrive at the clinic on time for your appointment.\n🩺 2. What to Expect at the Appointment # 🧳 What to Bring # ✅ Health insurance card (TK card) 💳 Credit card or cash (you must pay upfront for the vaccine and injection fee, around €200+) 🏥 Consultation Process # Check in at the reception desk: Present your insurance card and inform them you are there for the HPV vaccination. Fill out forms (if first visit): First-time patients usually complete basic registration forms. Consultation with the doctor: The doctor may ask whether you have received any HPV doses before. Prescription issuance (Rezept): The doctor will provide a prescription for the vaccine. ▲ Prescription (Rezept) Purchase the vaccine at a nearby pharmacy (Apotheke): The nine-valent HPV vaccine cost €196.80 in my case. ⚠️ Keep both the receipt and prescription carefully — you’ll need them for reimbursement. ▲ HPV Vaccine Return to the clinic for the injection: If it’s your first dose, you’ll also receive a vaccination booklet (Impfpass). I paid €41.22 for the injection fee and vaccination booklet. ⚠️ Keep this receipt as well. ▲ Vaccination Booklet (Impfpass) Receive the vaccine injection: The doctor or nurse will then administer the vaccine. 📅 Scheduling the Next Dose # At least 1 month between Dose 1 and Dose 2 At least 3 months between Dose 2 and Dose 3 All three doses must be completed within 12 months Bring your insurance card and vaccination booklet each time Since I only stayed in Germany for six months and didn’t plan early enough, I was only able to receive the first two doses there. Plan early if you intend to complete all three doses in Germany.\n💶 3. How to Apply for Reimbursement via the TK App # After receiving the vaccine, you must apply for reimbursement through TK. I used the TK App, which was very convenient. You may also apply via the TK website.\nStep-by-Step via TK App:\nOpen the TK App and tap “Reimbursements”. Scroll down and select “Vaccination”. Choose “HPV vaccination”. Fill in the cost details: Include the vaccination fee charged by the clinic as well as the amount paid for the vaccine at the pharmacy. Upload supporting documents: Prescription (Rezept) Pharmacy receipt (vaccine cost) Clinic receipt (injection fee and vaccination booklet fee) Enter your bank account (IBAN): Once approved, TK will transfer the reimbursement directly to your German bank account. 💡 My Reimbursement Experience:\nAfter submitting my application, I received a notification from the TK App within two days confirming the approved reimbursement amount. The funds were transferred to my German bank account the following day, which was impressively fast.\nIn total, I paid €238.02, and TK reimbursed €228.02. The remaining €10 was an out-of-pocket injection fee. Converted to Taiwanese dollars, I spent less than NT$400 to complete the HPV vaccination, which is incredibly cost-effective. I highly recommend making full use of your public health insurance benefits 💪\n🔗 Reference Links # German Healthcare Experience | Online Doctor Booking \u0026amp; Public Insurance HPV Reimbursement Guide HPV Vaccine Coverage under German Public Insurance | Vaccination \u0026amp; Reimbursement Process – Study Abroad Guide How to Get the 9-Valent HPV Vaccine in Germany | Appointment, Consultation \u0026amp; Reimbursement Guide HPV Vaccination Experience \u0026amp; Reimbursement Tutorial – Jula’s Germany Diary ","date":"27 Jun 2025","externalUrl":null,"permalink":"/en/posts/2025-germany-tk-hpv-vaccination-complete-guide/","section":"All Posts","summary":"","title":"Germany TK HPV Vaccine Guide (2025) – English Booking \u0026 Reimbursement Process","type":"posts"},{"content":"","date":"27 Jun 2025","externalUrl":null,"permalink":"/en/tags/hpv_vaccine/","section":"Tags","summary":"","title":"HPV Vaccine","type":"tags"},{"content":"","externalUrl":null,"permalink":"/en/tags/agentic_ai/","section":"Tags","summary":"","title":"Agentic AI","type":"tags"},{"content":"","externalUrl":null,"permalink":"/en/categories/ai-agent/","section":"Categories","summary":"","title":"AI Agent Collaboration","type":"categories"},{"content":"","externalUrl":null,"permalink":"/en/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/en/tags/codex/","section":"Tags","summary":"","title":"Codex","type":"tags"},{"content":"","externalUrl":null,"permalink":"/en/tags/europe/","section":"Tags","summary":"","title":"Europe","type":"tags"},{"content":"","externalUrl":null,"permalink":"/en/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","externalUrl":null,"permalink":"/en/tags/travel/","section":"Tags","summary":"","title":"Travel","type":"tags"},{"content":"","externalUrl":null,"permalink":"/en/tags/vibe_coding/","section":"Tags","summary":"","title":"Vibe Coding","type":"tags"}]