<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.rabbibob.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rabbi+Bob</id>
	<title>Rabbi Blog - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.rabbibob.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rabbi+Bob"/>
	<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php/Special:Contributions/Rabbi_Bob"/>
	<updated>2026-06-13T20:48:14Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1928</id>
		<title>VoYD</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1928"/>
		<updated>2026-05-17T13:26:57Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Gigs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gigs=&lt;br /&gt;
* https://www.rabbibob.com/voydcalendar/&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vS3fepEaCnI1XjzccsC7SXo5Dno9X6jm9Ghy7ubFGn9BAleei9UiFG3L8lFoSh6xmEpiqH8OiIRLVIG/pubhtml?gid=2044986723&amp;amp;single=true Calendar Output]&lt;br /&gt;
==Older==&lt;br /&gt;
* https://bit.ly/VoYDCalendar&lt;br /&gt;
&lt;br /&gt;
=Set List Mirror=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vQuDii0jPXrJPLGpp7I5wUEK6LWnRiEbuTezg-jLlTTVCzW63hOKYSgT3hzkxquQGcSYx3Hgk5VM0MI/pubhtml#gid=0 3 Sets]&lt;br /&gt;
* https://bit.ly/VoYD3&lt;br /&gt;
[[Category:VoYD]]&lt;br /&gt;
[[Category:Music]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1927</id>
		<title>VoYD</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1927"/>
		<updated>2026-05-17T13:26:43Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gigs=&lt;br /&gt;
* https://www.rabbibob.com/voydcalendar/&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vS3fepEaCnI1XjzccsC7SXo5Dno9X6jm9Ghy7ubFGn9BAleei9UiFG3L8lFoSh6xmEpiqH8OiIRLVIG/pubhtml?gid=2044986723&amp;amp;single=true Calendar Output]&lt;br /&gt;
* https://bit.ly/VoYDCalendar&lt;br /&gt;
&lt;br /&gt;
=Set List Mirror=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vQuDii0jPXrJPLGpp7I5wUEK6LWnRiEbuTezg-jLlTTVCzW63hOKYSgT3hzkxquQGcSYx3Hgk5VM0MI/pubhtml#gid=0 3 Sets]&lt;br /&gt;
* https://bit.ly/VoYD3&lt;br /&gt;
[[Category:VoYD]]&lt;br /&gt;
[[Category:Music]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD_Gig_Calendar&amp;diff=1926</id>
		<title>VoYD Gig Calendar</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD_Gig_Calendar&amp;diff=1926"/>
		<updated>2026-05-17T13:25:44Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==History==&lt;br /&gt;
I had a project at work recently combining 10+ Google calendars into one primary calendar.  It had to include a prefix on each event title so the event could be traced back to the proper department area and it had to add\update\delete depending on how the source calendar was updated.&lt;br /&gt;
&lt;br /&gt;
I keep a spreadsheet going for band related things and one of them is a calendar tab, but it isn&#039;t very portable.  The recent project got me to thinking about the spreadsheet: I have dates, venue name, some notes, the venue location, some approximation of the time we usually go live, and we have a FB page... let&#039;s have Google Apps Script update a calendar based on the spreadsheet.  Let&#039;s have it do it hourly.&lt;br /&gt;
&lt;br /&gt;
And it does!&lt;br /&gt;
&lt;br /&gt;
https://rabbibob.com/voydcalendar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==The Script==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function syncVoYDGigCalendar() {&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // CONFIGURATION &amp;amp; TOGGLES&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var VoYDDebug = 0; // 1 = Show full row-by-row debugging logs, 0 = Quiet summary mode&lt;br /&gt;
  var CALENDAR_ID = &amp;quot;thatspecialstringooiuwr209348294ufrjaowiuf2@group.calendar.google.com&amp;quot;;&lt;br /&gt;
  var FACEBOOK_URL = &amp;quot;https://facebook.com/voydrocks&amp;quot;;&lt;br /&gt;
// ==========================================&lt;br /&gt;
  // INITIALIZATION &amp;amp; SCRIPT SETUP&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var calendar = CalendarApp.getCalendarById(CALENDAR_ID);&lt;br /&gt;
  if (!calendar) {&lt;br /&gt;
    Logger.log(&amp;quot;❌ ERROR: Could not find or access calendar ID: &amp;quot; + CALENDAR_ID);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var ss = SpreadsheetApp.getActiveSpreadsheet(); &lt;br /&gt;
  var sheets = ss.getSheets();&lt;br /&gt;
  var sheet = null;&lt;br /&gt;
  &lt;br /&gt;
  // Target specifically by GID 729321447&lt;br /&gt;
  for (var i = 0; i &amp;lt; sheets.length; i++) {&lt;br /&gt;
    if (sheets[i].getSheetId() == 729321447) {&lt;br /&gt;
      sheet = sheets[i];&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (!sheet) {&lt;br /&gt;
    sheet = ss.getSheetByName(&amp;quot;Calendar&amp;quot;) || ss.getSheets()[0];&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var data = sheet.getDataRange().getValues();&lt;br /&gt;
  var timeZone = Session.getScriptTimeZone();&lt;br /&gt;
  &lt;br /&gt;
  if (VoYDDebug === 1) {&lt;br /&gt;
    Logger.log(&amp;quot;=========== STARTING SHEET SCAN ===========&amp;quot;);&lt;br /&gt;
    Logger.log(&amp;quot;📊 Total rows found in sheet (including header): &amp;quot; + data.length);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Fetch existing calendar events for 2024 to 2026&lt;br /&gt;
  var startRange = new Date(&amp;quot;2024-01-01T00:00:00&amp;quot;);&lt;br /&gt;
  var endRange = new Date(&amp;quot;2036-12-31T23:59:59&amp;quot;);&lt;br /&gt;
  var calendarEvents = calendar.getEvents(startRange, endRange);&lt;br /&gt;
  &lt;br /&gt;
  var calEventsMap = {};&lt;br /&gt;
  for (var j = 0; j &amp;lt; calendarEvents.length; j++) {&lt;br /&gt;
    var ev = calendarEvents[j];&lt;br /&gt;
    var tagKey = ev.getTag(&amp;quot;GIG_KEY&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (!tagKey) {&lt;br /&gt;
      var evDateStr = Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
      var evTitle = ev.getTitle();&lt;br /&gt;
      var extractedVenue = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (evTitle.indexOf(&amp;quot;VoYD played &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD played &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD plays &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD plays &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD might play &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD might play &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      tagKey = extractedVenue ? (evDateStr + &amp;quot;_&amp;quot; + extractedVenue) : (evDateStr + &amp;quot;_&amp;quot; + ev.getLocation());&lt;br /&gt;
    }&lt;br /&gt;
    calEventsMap[tagKey] = ev;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var validSheetKeys = {};&lt;br /&gt;
  var metrics = { scanned: 0, accepted: 0, rejected: 0 };&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // PROCESS SPREADSHEET ROWS&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  for (var i = 1; i &amp;lt; data.length; i++) {&lt;br /&gt;
    var row = data[i];&lt;br /&gt;
    metrics.scanned++;&lt;br /&gt;
    &lt;br /&gt;
    var filterValue = String(row[0] || &amp;quot;&amp;quot;).toLowerCase().trim(); &lt;br /&gt;
    var dateRaw = row[1];                                       &lt;br /&gt;
    var venue = String(row[4] || &amp;quot;&amp;quot;).trim();                    &lt;br /&gt;
    var desc = String(row[5] || &amp;quot;&amp;quot;).trim();                     &lt;br /&gt;
    &lt;br /&gt;
    var humanRowNumber = i + 1;&lt;br /&gt;
    &lt;br /&gt;
    // Safe date alignment and year compilation&lt;br /&gt;
    var isDateValid = dateRaw &amp;amp;&amp;amp; !isNaN(new Date(dateRaw).getTime());&lt;br /&gt;
    var yearValue = 0;&lt;br /&gt;
    &lt;br /&gt;
    if (isDateValid) {&lt;br /&gt;
      var parsedDate = new Date(dateRaw);&lt;br /&gt;
      yearValue = parsedDate.getFullYear(); &lt;br /&gt;
    } else {&lt;br /&gt;
      var backupYear = Number(row[2]);&lt;br /&gt;
      if (!isNaN(backupYear)) {&lt;br /&gt;
        yearValue = backupYear;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var isFilterValid = [&amp;quot;played&amp;quot;, &amp;quot;scheduled&amp;quot;, &amp;quot;potential&amp;quot;].indexOf(filterValue) !== -1;&lt;br /&gt;
    var isYearValid = [2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036].indexOf(yearValue) !== -1;&lt;br /&gt;
    &lt;br /&gt;
    if (!isFilterValid || !isYearValid || !isDateValid) {&lt;br /&gt;
      metrics.rejected++;&lt;br /&gt;
      &lt;br /&gt;
      // Conditional Debug Logging for Skips&lt;br /&gt;
      if (VoYDDebug === 1) {&lt;br /&gt;
        var reasons = [];&lt;br /&gt;
        if (!isFilterValid) reasons.push(&amp;quot;Filter value &#039;&amp;quot; + (row[0] || &amp;quot;BLANK&amp;quot;) + &amp;quot;&#039; is not accepted&amp;quot;);&lt;br /&gt;
        if (!isDateValid) reasons.push(&amp;quot;Invalid date format in Column B&amp;quot;);&lt;br /&gt;
        if (isDateValid &amp;amp;&amp;amp; !isYearValid) reasons.push(&amp;quot;Extracted year &#039;&amp;quot; + yearValue + &amp;quot;&#039; is outside 2024-2026&amp;quot;);&lt;br /&gt;
        Logger.log(&amp;quot;❌ Row &amp;quot; + humanRowNumber + &amp;quot; SKIPPED. Reasons: &amp;quot; + reasons.join(&amp;quot; | &amp;quot;));&lt;br /&gt;
      }&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Handled Accepted Rows&lt;br /&gt;
    metrics.accepted++;&lt;br /&gt;
    var dateObj = new Date(dateRaw);&lt;br /&gt;
    var dateStr = Utilities.formatDate(dateObj, timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (VoYDDebug === 1) {&lt;br /&gt;
      Logger.log(&amp;quot;✅ Row &amp;quot; + humanRowNumber + &amp;quot; ACCEPTED: &amp;quot; + filterValue.toUpperCase() + &amp;quot; -&amp;gt; &amp;quot; + venue + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var sheetKey = dateStr + &amp;quot;_&amp;quot; + venue;&lt;br /&gt;
    validSheetKeys[sheetKey] = true;&lt;br /&gt;
    &lt;br /&gt;
    var prefix = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (filterValue === &amp;quot;played&amp;quot;) prefix = &amp;quot;VoYD played &amp;quot;;&lt;br /&gt;
    else if (filterValue === &amp;quot;scheduled&amp;quot;) prefix = &amp;quot;VoYD plays &amp;quot;;&lt;br /&gt;
    else if (filterValue === &amp;quot;potential&amp;quot;) prefix = &amp;quot;VoYD might play &amp;quot;;&lt;br /&gt;
    var title = prefix + venue;&lt;br /&gt;
    &lt;br /&gt;
    var location = (venue &amp;amp;&amp;amp; venue !== &amp;quot;.&amp;quot;) ? venue : &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    var descriptionText = &amp;quot;See VoYD at &amp;quot; + venue + &amp;quot;!\n\n&amp;quot;;&lt;br /&gt;
    if (desc &amp;amp;&amp;amp; desc !== &amp;quot;.&amp;quot;) {&lt;br /&gt;
      descriptionText += desc + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    descriptionText += &amp;quot;For specific information, check out our FB page at &amp;quot; + FACEBOOK_URL + &amp;quot;\n\nHope to see you there!&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    // Evaluate additions/modifications&lt;br /&gt;
    if (calEventsMap[sheetKey]) {&lt;br /&gt;
      var existingEvent = calEventsMap[sheetKey];&lt;br /&gt;
      var hasChanged = false;&lt;br /&gt;
      &lt;br /&gt;
      if (existingEvent.getTitle() !== title) hasChanged = true;&lt;br /&gt;
      if (existingEvent.getLocation() !== location) hasChanged = true;&lt;br /&gt;
      if (existingEvent.getDescription() !== descriptionText) hasChanged = true;&lt;br /&gt;
      if (!existingEvent.isAllDayEvent()) hasChanged = true;&lt;br /&gt;
      &lt;br /&gt;
      if (hasChanged) {&lt;br /&gt;
        existingEvent.setTitle(title);&lt;br /&gt;
        existingEvent.setLocation(location);&lt;br /&gt;
        existingEvent.setDescription(descriptionText);&lt;br /&gt;
        existingEvent.setTag(&amp;quot;GIG_KEY&amp;quot;, sheetKey);&lt;br /&gt;
        existingEvent.setVisibility(CalendarApp.Visibility.PUBLIC);&lt;br /&gt;
        Logger.log(&amp;quot;   🔄 Calendar Updated: &amp;quot; + title + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
      } else if (VoYDDebug === 1) {&lt;br /&gt;
        Logger.log(&amp;quot;   💤 No changes needed for: &amp;quot; + title);&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      var newEvent = calendar.createAllDayEvent(title, dateObj, {&lt;br /&gt;
        description: descriptionText,&lt;br /&gt;
        location: location&lt;br /&gt;
      });&lt;br /&gt;
      newEvent.setTag(&amp;quot;GIG_KEY&amp;quot;, sheetKey);&lt;br /&gt;
      newEvent.setVisibility(CalendarApp.Visibility.PUBLIC);&lt;br /&gt;
      Logger.log(&amp;quot;   ➕ Calendar Created: &amp;quot; + title + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (VoYDDebug === 1) {&lt;br /&gt;
    Logger.log(&amp;quot;=========== STARTING CALENDAR CLEANUP ===========&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // PURGE STALE CALENDAR EVENTS&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var deletedCount = 0;&lt;br /&gt;
  for (var j = 0; j &amp;lt; calendarEvents.length; j++) {&lt;br /&gt;
    var ev = calendarEvents[j];&lt;br /&gt;
    var tagKey = ev.getTag(&amp;quot;GIG_KEY&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (!tagKey) {&lt;br /&gt;
      var evDateStr = Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
      var evTitle = ev.getTitle();&lt;br /&gt;
      var extractedVenue = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (evTitle.indexOf(&amp;quot;VoYD played &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD played &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD plays &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD plays &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD might play &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD might play &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      tagKey = extractedVenue ? (evDateStr + &amp;quot;_&amp;quot; + extractedVenue) : (evDateStr + &amp;quot;_&amp;quot; + ev.getLocation());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var isManagedEvent = ev.getTag(&amp;quot;GIG_KEY&amp;quot;) || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD played &amp;quot;) === 0 || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD plays &amp;quot;) === 0 || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD might play &amp;quot;) === 0;&lt;br /&gt;
    &lt;br /&gt;
    if (isManagedEvent &amp;amp;&amp;amp; !validSheetKeys[tagKey]) {&lt;br /&gt;
      Logger.log(&amp;quot;🗑️ Calendar Deleted (no longer in sheet/valid): &amp;quot; + ev.getTitle() + &amp;quot; on &amp;quot; + Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;));&lt;br /&gt;
      ev.deleteEvent();&lt;br /&gt;
      deletedCount++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // FINAL METRICS SUMMARY (Always Displays)&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  Logger.log(&amp;quot;=========== FINAL PERFORMANCE SUMMARY ===========&amp;quot;);&lt;br /&gt;
  Logger.log(&amp;quot;📋 Total Data Rows Scanned: &amp;quot; + metrics.scanned);&lt;br /&gt;
  Logger.log(&amp;quot;🎉 Total Rows Accepted:     &amp;quot; + metrics.accepted);&lt;br /&gt;
  Logger.log(&amp;quot;🚫 Total Rows Filtered Out: &amp;quot; + metrics.rejected);&lt;br /&gt;
  Logger.log(&amp;quot;🗑️ Calendar Events Purged:  &amp;quot; + deletedCount);&lt;br /&gt;
  Logger.log(&amp;quot;=================================================&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Category:VoYD]]&lt;br /&gt;
[[Category:Google Apps Script]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD_Gig_Calendar&amp;diff=1925</id>
		<title>VoYD Gig Calendar</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD_Gig_Calendar&amp;diff=1925"/>
		<updated>2026-05-17T13:25:03Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;==History== I had a project at work recently combining 10+ Google calendars into one primary calendar.  It had to include a prefix on each event title so the event could be traced back to the proper department area and it had to add\update\delete depending on how the source calendar was updated.  I keep a spreadsheet going for band related things and one of them is a calendar tab, but it isn&amp;#039;t very portable.  The recent project got me to thinking about the spreadsheet: I...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==History==&lt;br /&gt;
I had a project at work recently combining 10+ Google calendars into one primary calendar.  It had to include a prefix on each event title so the event could be traced back to the proper department area and it had to add\update\delete depending on how the source calendar was updated.&lt;br /&gt;
&lt;br /&gt;
I keep a spreadsheet going for band related things and one of them is a calendar tab, but it isn&#039;t very portable.  The recent project got me to thinking about the spreadsheet: I have dates, venue name, some notes, the venue location, some approximation of the time we usually go live, and we have a FB page... let&#039;s have Google App Scripts update a calendar based on the spreadsheet.  Let&#039;s have it do it hourly.&lt;br /&gt;
&lt;br /&gt;
And it does!&lt;br /&gt;
&lt;br /&gt;
https://rabbibob.com/voydcalendar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==The Script==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function syncVoYDGigCalendar() {&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // CONFIGURATION &amp;amp; TOGGLES&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var VoYDDebug = 0; // 1 = Show full row-by-row debugging logs, 0 = Quiet summary mode&lt;br /&gt;
  var CALENDAR_ID = &amp;quot;thatspecialstringooiuwr209348294ufrjaowiuf2@group.calendar.google.com&amp;quot;;&lt;br /&gt;
  var FACEBOOK_URL = &amp;quot;https://facebook.com/voydrocks&amp;quot;;&lt;br /&gt;
// ==========================================&lt;br /&gt;
  // INITIALIZATION &amp;amp; SCRIPT SETUP&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var calendar = CalendarApp.getCalendarById(CALENDAR_ID);&lt;br /&gt;
  if (!calendar) {&lt;br /&gt;
    Logger.log(&amp;quot;❌ ERROR: Could not find or access calendar ID: &amp;quot; + CALENDAR_ID);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var ss = SpreadsheetApp.getActiveSpreadsheet(); &lt;br /&gt;
  var sheets = ss.getSheets();&lt;br /&gt;
  var sheet = null;&lt;br /&gt;
  &lt;br /&gt;
  // Target specifically by GID 729321447&lt;br /&gt;
  for (var i = 0; i &amp;lt; sheets.length; i++) {&lt;br /&gt;
    if (sheets[i].getSheetId() == 729321447) {&lt;br /&gt;
      sheet = sheets[i];&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (!sheet) {&lt;br /&gt;
    sheet = ss.getSheetByName(&amp;quot;Calendar&amp;quot;) || ss.getSheets()[0];&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var data = sheet.getDataRange().getValues();&lt;br /&gt;
  var timeZone = Session.getScriptTimeZone();&lt;br /&gt;
  &lt;br /&gt;
  if (VoYDDebug === 1) {&lt;br /&gt;
    Logger.log(&amp;quot;=========== STARTING SHEET SCAN ===========&amp;quot;);&lt;br /&gt;
    Logger.log(&amp;quot;📊 Total rows found in sheet (including header): &amp;quot; + data.length);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Fetch existing calendar events for 2024 to 2026&lt;br /&gt;
  var startRange = new Date(&amp;quot;2024-01-01T00:00:00&amp;quot;);&lt;br /&gt;
  var endRange = new Date(&amp;quot;2036-12-31T23:59:59&amp;quot;);&lt;br /&gt;
  var calendarEvents = calendar.getEvents(startRange, endRange);&lt;br /&gt;
  &lt;br /&gt;
  var calEventsMap = {};&lt;br /&gt;
  for (var j = 0; j &amp;lt; calendarEvents.length; j++) {&lt;br /&gt;
    var ev = calendarEvents[j];&lt;br /&gt;
    var tagKey = ev.getTag(&amp;quot;GIG_KEY&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (!tagKey) {&lt;br /&gt;
      var evDateStr = Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
      var evTitle = ev.getTitle();&lt;br /&gt;
      var extractedVenue = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (evTitle.indexOf(&amp;quot;VoYD played &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD played &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD plays &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD plays &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD might play &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD might play &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      tagKey = extractedVenue ? (evDateStr + &amp;quot;_&amp;quot; + extractedVenue) : (evDateStr + &amp;quot;_&amp;quot; + ev.getLocation());&lt;br /&gt;
    }&lt;br /&gt;
    calEventsMap[tagKey] = ev;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var validSheetKeys = {};&lt;br /&gt;
  var metrics = { scanned: 0, accepted: 0, rejected: 0 };&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // PROCESS SPREADSHEET ROWS&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  for (var i = 1; i &amp;lt; data.length; i++) {&lt;br /&gt;
    var row = data[i];&lt;br /&gt;
    metrics.scanned++;&lt;br /&gt;
    &lt;br /&gt;
    var filterValue = String(row[0] || &amp;quot;&amp;quot;).toLowerCase().trim(); &lt;br /&gt;
    var dateRaw = row[1];                                       &lt;br /&gt;
    var venue = String(row[4] || &amp;quot;&amp;quot;).trim();                    &lt;br /&gt;
    var desc = String(row[5] || &amp;quot;&amp;quot;).trim();                     &lt;br /&gt;
    &lt;br /&gt;
    var humanRowNumber = i + 1;&lt;br /&gt;
    &lt;br /&gt;
    // Safe date alignment and year compilation&lt;br /&gt;
    var isDateValid = dateRaw &amp;amp;&amp;amp; !isNaN(new Date(dateRaw).getTime());&lt;br /&gt;
    var yearValue = 0;&lt;br /&gt;
    &lt;br /&gt;
    if (isDateValid) {&lt;br /&gt;
      var parsedDate = new Date(dateRaw);&lt;br /&gt;
      yearValue = parsedDate.getFullYear(); &lt;br /&gt;
    } else {&lt;br /&gt;
      var backupYear = Number(row[2]);&lt;br /&gt;
      if (!isNaN(backupYear)) {&lt;br /&gt;
        yearValue = backupYear;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var isFilterValid = [&amp;quot;played&amp;quot;, &amp;quot;scheduled&amp;quot;, &amp;quot;potential&amp;quot;].indexOf(filterValue) !== -1;&lt;br /&gt;
    var isYearValid = [2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036].indexOf(yearValue) !== -1;&lt;br /&gt;
    &lt;br /&gt;
    if (!isFilterValid || !isYearValid || !isDateValid) {&lt;br /&gt;
      metrics.rejected++;&lt;br /&gt;
      &lt;br /&gt;
      // Conditional Debug Logging for Skips&lt;br /&gt;
      if (VoYDDebug === 1) {&lt;br /&gt;
        var reasons = [];&lt;br /&gt;
        if (!isFilterValid) reasons.push(&amp;quot;Filter value &#039;&amp;quot; + (row[0] || &amp;quot;BLANK&amp;quot;) + &amp;quot;&#039; is not accepted&amp;quot;);&lt;br /&gt;
        if (!isDateValid) reasons.push(&amp;quot;Invalid date format in Column B&amp;quot;);&lt;br /&gt;
        if (isDateValid &amp;amp;&amp;amp; !isYearValid) reasons.push(&amp;quot;Extracted year &#039;&amp;quot; + yearValue + &amp;quot;&#039; is outside 2024-2026&amp;quot;);&lt;br /&gt;
        Logger.log(&amp;quot;❌ Row &amp;quot; + humanRowNumber + &amp;quot; SKIPPED. Reasons: &amp;quot; + reasons.join(&amp;quot; | &amp;quot;));&lt;br /&gt;
      }&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Handled Accepted Rows&lt;br /&gt;
    metrics.accepted++;&lt;br /&gt;
    var dateObj = new Date(dateRaw);&lt;br /&gt;
    var dateStr = Utilities.formatDate(dateObj, timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (VoYDDebug === 1) {&lt;br /&gt;
      Logger.log(&amp;quot;✅ Row &amp;quot; + humanRowNumber + &amp;quot; ACCEPTED: &amp;quot; + filterValue.toUpperCase() + &amp;quot; -&amp;gt; &amp;quot; + venue + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var sheetKey = dateStr + &amp;quot;_&amp;quot; + venue;&lt;br /&gt;
    validSheetKeys[sheetKey] = true;&lt;br /&gt;
    &lt;br /&gt;
    var prefix = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (filterValue === &amp;quot;played&amp;quot;) prefix = &amp;quot;VoYD played &amp;quot;;&lt;br /&gt;
    else if (filterValue === &amp;quot;scheduled&amp;quot;) prefix = &amp;quot;VoYD plays &amp;quot;;&lt;br /&gt;
    else if (filterValue === &amp;quot;potential&amp;quot;) prefix = &amp;quot;VoYD might play &amp;quot;;&lt;br /&gt;
    var title = prefix + venue;&lt;br /&gt;
    &lt;br /&gt;
    var location = (venue &amp;amp;&amp;amp; venue !== &amp;quot;.&amp;quot;) ? venue : &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    var descriptionText = &amp;quot;See VoYD at &amp;quot; + venue + &amp;quot;!\n\n&amp;quot;;&lt;br /&gt;
    if (desc &amp;amp;&amp;amp; desc !== &amp;quot;.&amp;quot;) {&lt;br /&gt;
      descriptionText += desc + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    descriptionText += &amp;quot;For specific information, check out our FB page at &amp;quot; + FACEBOOK_URL + &amp;quot;\n\nHope to see you there!&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    // Evaluate additions/modifications&lt;br /&gt;
    if (calEventsMap[sheetKey]) {&lt;br /&gt;
      var existingEvent = calEventsMap[sheetKey];&lt;br /&gt;
      var hasChanged = false;&lt;br /&gt;
      &lt;br /&gt;
      if (existingEvent.getTitle() !== title) hasChanged = true;&lt;br /&gt;
      if (existingEvent.getLocation() !== location) hasChanged = true;&lt;br /&gt;
      if (existingEvent.getDescription() !== descriptionText) hasChanged = true;&lt;br /&gt;
      if (!existingEvent.isAllDayEvent()) hasChanged = true;&lt;br /&gt;
      &lt;br /&gt;
      if (hasChanged) {&lt;br /&gt;
        existingEvent.setTitle(title);&lt;br /&gt;
        existingEvent.setLocation(location);&lt;br /&gt;
        existingEvent.setDescription(descriptionText);&lt;br /&gt;
        existingEvent.setTag(&amp;quot;GIG_KEY&amp;quot;, sheetKey);&lt;br /&gt;
        existingEvent.setVisibility(CalendarApp.Visibility.PUBLIC);&lt;br /&gt;
        Logger.log(&amp;quot;   🔄 Calendar Updated: &amp;quot; + title + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
      } else if (VoYDDebug === 1) {&lt;br /&gt;
        Logger.log(&amp;quot;   💤 No changes needed for: &amp;quot; + title);&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      var newEvent = calendar.createAllDayEvent(title, dateObj, {&lt;br /&gt;
        description: descriptionText,&lt;br /&gt;
        location: location&lt;br /&gt;
      });&lt;br /&gt;
      newEvent.setTag(&amp;quot;GIG_KEY&amp;quot;, sheetKey);&lt;br /&gt;
      newEvent.setVisibility(CalendarApp.Visibility.PUBLIC);&lt;br /&gt;
      Logger.log(&amp;quot;   ➕ Calendar Created: &amp;quot; + title + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (VoYDDebug === 1) {&lt;br /&gt;
    Logger.log(&amp;quot;=========== STARTING CALENDAR CLEANUP ===========&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // PURGE STALE CALENDAR EVENTS&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var deletedCount = 0;&lt;br /&gt;
  for (var j = 0; j &amp;lt; calendarEvents.length; j++) {&lt;br /&gt;
    var ev = calendarEvents[j];&lt;br /&gt;
    var tagKey = ev.getTag(&amp;quot;GIG_KEY&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (!tagKey) {&lt;br /&gt;
      var evDateStr = Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
      var evTitle = ev.getTitle();&lt;br /&gt;
      var extractedVenue = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (evTitle.indexOf(&amp;quot;VoYD played &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD played &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD plays &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD plays &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD might play &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD might play &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      tagKey = extractedVenue ? (evDateStr + &amp;quot;_&amp;quot; + extractedVenue) : (evDateStr + &amp;quot;_&amp;quot; + ev.getLocation());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var isManagedEvent = ev.getTag(&amp;quot;GIG_KEY&amp;quot;) || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD played &amp;quot;) === 0 || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD plays &amp;quot;) === 0 || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD might play &amp;quot;) === 0;&lt;br /&gt;
    &lt;br /&gt;
    if (isManagedEvent &amp;amp;&amp;amp; !validSheetKeys[tagKey]) {&lt;br /&gt;
      Logger.log(&amp;quot;🗑️ Calendar Deleted (no longer in sheet/valid): &amp;quot; + ev.getTitle() + &amp;quot; on &amp;quot; + Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;));&lt;br /&gt;
      ev.deleteEvent();&lt;br /&gt;
      deletedCount++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // FINAL METRICS SUMMARY (Always Displays)&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  Logger.log(&amp;quot;=========== FINAL PERFORMANCE SUMMARY ===========&amp;quot;);&lt;br /&gt;
  Logger.log(&amp;quot;📋 Total Data Rows Scanned: &amp;quot; + metrics.scanned);&lt;br /&gt;
  Logger.log(&amp;quot;🎉 Total Rows Accepted:     &amp;quot; + metrics.accepted);&lt;br /&gt;
  Logger.log(&amp;quot;🚫 Total Rows Filtered Out: &amp;quot; + metrics.rejected);&lt;br /&gt;
  Logger.log(&amp;quot;🗑️ Calendar Events Purged:  &amp;quot; + deletedCount);&lt;br /&gt;
  Logger.log(&amp;quot;=================================================&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoyD_Gig_Calendar&amp;diff=1924</id>
		<title>VoyD Gig Calendar</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoyD_Gig_Calendar&amp;diff=1924"/>
		<updated>2026-05-17T13:24:59Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Redirected page to VoYD Gig Calendar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#Redirect[[VoYD Gig Calendar]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoyD_Gig_Calendar&amp;diff=1923</id>
		<title>VoyD Gig Calendar</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoyD_Gig_Calendar&amp;diff=1923"/>
		<updated>2026-05-17T13:21:02Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;==History== I had a project at work recently combining 10+ Google calendars into one primary calendar.  It had to include a prefix on each event title so the event could be traced back to the proper department area and it had to add\update\delete depending on how the source calendar was updated.  I keep a spreadsheet going for band related things and one of them is a calendar tab, but it isn&amp;#039;t very portable.  The recent project got me to thinking about the spreadsheet: I...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==History==&lt;br /&gt;
I had a project at work recently combining 10+ Google calendars into one primary calendar.  It had to include a prefix on each event title so the event could be traced back to the proper department area and it had to add\update\delete depending on how the source calendar was updated.&lt;br /&gt;
&lt;br /&gt;
I keep a spreadsheet going for band related things and one of them is a calendar tab, but it isn&#039;t very portable.  The recent project got me to thinking about the spreadsheet: I have dates, venue name, some notes, the venue location, some approximation of the time we usually go live, and we have a FB page... let&#039;s have Google App Scripts update a calendar based on the spreadsheet.  Let&#039;s have it do it hourly.&lt;br /&gt;
&lt;br /&gt;
And it does!&lt;br /&gt;
&lt;br /&gt;
https://rabbibob.com/voydcalendar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==The Script==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function syncVoYDGigCalendar() {&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // CONFIGURATION &amp;amp; TOGGLES&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var VoYDDebug = 0; // 1 = Show full row-by-row debugging logs, 0 = Quiet summary mode&lt;br /&gt;
  var CALENDAR_ID = &amp;quot;thatspecialstringooiuwr209348294ufrjaowiuf2@group.calendar.google.com&amp;quot;;&lt;br /&gt;
  var FACEBOOK_URL = &amp;quot;https://facebook.com/voydrocks&amp;quot;;&lt;br /&gt;
// ==========================================&lt;br /&gt;
  // INITIALIZATION &amp;amp; SCRIPT SETUP&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var calendar = CalendarApp.getCalendarById(CALENDAR_ID);&lt;br /&gt;
  if (!calendar) {&lt;br /&gt;
    Logger.log(&amp;quot;❌ ERROR: Could not find or access calendar ID: &amp;quot; + CALENDAR_ID);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var ss = SpreadsheetApp.getActiveSpreadsheet(); &lt;br /&gt;
  var sheets = ss.getSheets();&lt;br /&gt;
  var sheet = null;&lt;br /&gt;
  &lt;br /&gt;
  // Target specifically by GID 729321447&lt;br /&gt;
  for (var i = 0; i &amp;lt; sheets.length; i++) {&lt;br /&gt;
    if (sheets[i].getSheetId() == 729321447) {&lt;br /&gt;
      sheet = sheets[i];&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (!sheet) {&lt;br /&gt;
    sheet = ss.getSheetByName(&amp;quot;Calendar&amp;quot;) || ss.getSheets()[0];&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var data = sheet.getDataRange().getValues();&lt;br /&gt;
  var timeZone = Session.getScriptTimeZone();&lt;br /&gt;
  &lt;br /&gt;
  if (VoYDDebug === 1) {&lt;br /&gt;
    Logger.log(&amp;quot;=========== STARTING SHEET SCAN ===========&amp;quot;);&lt;br /&gt;
    Logger.log(&amp;quot;📊 Total rows found in sheet (including header): &amp;quot; + data.length);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Fetch existing calendar events for 2024 to 2026&lt;br /&gt;
  var startRange = new Date(&amp;quot;2024-01-01T00:00:00&amp;quot;);&lt;br /&gt;
  var endRange = new Date(&amp;quot;2036-12-31T23:59:59&amp;quot;);&lt;br /&gt;
  var calendarEvents = calendar.getEvents(startRange, endRange);&lt;br /&gt;
  &lt;br /&gt;
  var calEventsMap = {};&lt;br /&gt;
  for (var j = 0; j &amp;lt; calendarEvents.length; j++) {&lt;br /&gt;
    var ev = calendarEvents[j];&lt;br /&gt;
    var tagKey = ev.getTag(&amp;quot;GIG_KEY&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (!tagKey) {&lt;br /&gt;
      var evDateStr = Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
      var evTitle = ev.getTitle();&lt;br /&gt;
      var extractedVenue = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (evTitle.indexOf(&amp;quot;VoYD played &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD played &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD plays &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD plays &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD might play &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD might play &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      tagKey = extractedVenue ? (evDateStr + &amp;quot;_&amp;quot; + extractedVenue) : (evDateStr + &amp;quot;_&amp;quot; + ev.getLocation());&lt;br /&gt;
    }&lt;br /&gt;
    calEventsMap[tagKey] = ev;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  var validSheetKeys = {};&lt;br /&gt;
  var metrics = { scanned: 0, accepted: 0, rejected: 0 };&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // PROCESS SPREADSHEET ROWS&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  for (var i = 1; i &amp;lt; data.length; i++) {&lt;br /&gt;
    var row = data[i];&lt;br /&gt;
    metrics.scanned++;&lt;br /&gt;
    &lt;br /&gt;
    var filterValue = String(row[0] || &amp;quot;&amp;quot;).toLowerCase().trim(); &lt;br /&gt;
    var dateRaw = row[1];                                       &lt;br /&gt;
    var venue = String(row[4] || &amp;quot;&amp;quot;).trim();                    &lt;br /&gt;
    var desc = String(row[5] || &amp;quot;&amp;quot;).trim();                     &lt;br /&gt;
    &lt;br /&gt;
    var humanRowNumber = i + 1;&lt;br /&gt;
    &lt;br /&gt;
    // Safe date alignment and year compilation&lt;br /&gt;
    var isDateValid = dateRaw &amp;amp;&amp;amp; !isNaN(new Date(dateRaw).getTime());&lt;br /&gt;
    var yearValue = 0;&lt;br /&gt;
    &lt;br /&gt;
    if (isDateValid) {&lt;br /&gt;
      var parsedDate = new Date(dateRaw);&lt;br /&gt;
      yearValue = parsedDate.getFullYear(); &lt;br /&gt;
    } else {&lt;br /&gt;
      var backupYear = Number(row[2]);&lt;br /&gt;
      if (!isNaN(backupYear)) {&lt;br /&gt;
        yearValue = backupYear;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var isFilterValid = [&amp;quot;played&amp;quot;, &amp;quot;scheduled&amp;quot;, &amp;quot;potential&amp;quot;].indexOf(filterValue) !== -1;&lt;br /&gt;
    var isYearValid = [2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036].indexOf(yearValue) !== -1;&lt;br /&gt;
    &lt;br /&gt;
    if (!isFilterValid || !isYearValid || !isDateValid) {&lt;br /&gt;
      metrics.rejected++;&lt;br /&gt;
      &lt;br /&gt;
      // Conditional Debug Logging for Skips&lt;br /&gt;
      if (VoYDDebug === 1) {&lt;br /&gt;
        var reasons = [];&lt;br /&gt;
        if (!isFilterValid) reasons.push(&amp;quot;Filter value &#039;&amp;quot; + (row[0] || &amp;quot;BLANK&amp;quot;) + &amp;quot;&#039; is not accepted&amp;quot;);&lt;br /&gt;
        if (!isDateValid) reasons.push(&amp;quot;Invalid date format in Column B&amp;quot;);&lt;br /&gt;
        if (isDateValid &amp;amp;&amp;amp; !isYearValid) reasons.push(&amp;quot;Extracted year &#039;&amp;quot; + yearValue + &amp;quot;&#039; is outside 2024-2026&amp;quot;);&lt;br /&gt;
        Logger.log(&amp;quot;❌ Row &amp;quot; + humanRowNumber + &amp;quot; SKIPPED. Reasons: &amp;quot; + reasons.join(&amp;quot; | &amp;quot;));&lt;br /&gt;
      }&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Handled Accepted Rows&lt;br /&gt;
    metrics.accepted++;&lt;br /&gt;
    var dateObj = new Date(dateRaw);&lt;br /&gt;
    var dateStr = Utilities.formatDate(dateObj, timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (VoYDDebug === 1) {&lt;br /&gt;
      Logger.log(&amp;quot;✅ Row &amp;quot; + humanRowNumber + &amp;quot; ACCEPTED: &amp;quot; + filterValue.toUpperCase() + &amp;quot; -&amp;gt; &amp;quot; + venue + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var sheetKey = dateStr + &amp;quot;_&amp;quot; + venue;&lt;br /&gt;
    validSheetKeys[sheetKey] = true;&lt;br /&gt;
    &lt;br /&gt;
    var prefix = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (filterValue === &amp;quot;played&amp;quot;) prefix = &amp;quot;VoYD played &amp;quot;;&lt;br /&gt;
    else if (filterValue === &amp;quot;scheduled&amp;quot;) prefix = &amp;quot;VoYD plays &amp;quot;;&lt;br /&gt;
    else if (filterValue === &amp;quot;potential&amp;quot;) prefix = &amp;quot;VoYD might play &amp;quot;;&lt;br /&gt;
    var title = prefix + venue;&lt;br /&gt;
    &lt;br /&gt;
    var location = (venue &amp;amp;&amp;amp; venue !== &amp;quot;.&amp;quot;) ? venue : &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    var descriptionText = &amp;quot;See VoYD at &amp;quot; + venue + &amp;quot;!\n\n&amp;quot;;&lt;br /&gt;
    if (desc &amp;amp;&amp;amp; desc !== &amp;quot;.&amp;quot;) {&lt;br /&gt;
      descriptionText += desc + &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    descriptionText += &amp;quot;For specific information, check out our FB page at &amp;quot; + FACEBOOK_URL + &amp;quot;\n\nHope to see you there!&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    // Evaluate additions/modifications&lt;br /&gt;
    if (calEventsMap[sheetKey]) {&lt;br /&gt;
      var existingEvent = calEventsMap[sheetKey];&lt;br /&gt;
      var hasChanged = false;&lt;br /&gt;
      &lt;br /&gt;
      if (existingEvent.getTitle() !== title) hasChanged = true;&lt;br /&gt;
      if (existingEvent.getLocation() !== location) hasChanged = true;&lt;br /&gt;
      if (existingEvent.getDescription() !== descriptionText) hasChanged = true;&lt;br /&gt;
      if (!existingEvent.isAllDayEvent()) hasChanged = true;&lt;br /&gt;
      &lt;br /&gt;
      if (hasChanged) {&lt;br /&gt;
        existingEvent.setTitle(title);&lt;br /&gt;
        existingEvent.setLocation(location);&lt;br /&gt;
        existingEvent.setDescription(descriptionText);&lt;br /&gt;
        existingEvent.setTag(&amp;quot;GIG_KEY&amp;quot;, sheetKey);&lt;br /&gt;
        existingEvent.setVisibility(CalendarApp.Visibility.PUBLIC);&lt;br /&gt;
        Logger.log(&amp;quot;   🔄 Calendar Updated: &amp;quot; + title + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
      } else if (VoYDDebug === 1) {&lt;br /&gt;
        Logger.log(&amp;quot;   💤 No changes needed for: &amp;quot; + title);&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      var newEvent = calendar.createAllDayEvent(title, dateObj, {&lt;br /&gt;
        description: descriptionText,&lt;br /&gt;
        location: location&lt;br /&gt;
      });&lt;br /&gt;
      newEvent.setTag(&amp;quot;GIG_KEY&amp;quot;, sheetKey);&lt;br /&gt;
      newEvent.setVisibility(CalendarApp.Visibility.PUBLIC);&lt;br /&gt;
      Logger.log(&amp;quot;   ➕ Calendar Created: &amp;quot; + title + &amp;quot; (&amp;quot; + dateStr + &amp;quot;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (VoYDDebug === 1) {&lt;br /&gt;
    Logger.log(&amp;quot;=========== STARTING CALENDAR CLEANUP ===========&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // PURGE STALE CALENDAR EVENTS&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  var deletedCount = 0;&lt;br /&gt;
  for (var j = 0; j &amp;lt; calendarEvents.length; j++) {&lt;br /&gt;
    var ev = calendarEvents[j];&lt;br /&gt;
    var tagKey = ev.getTag(&amp;quot;GIG_KEY&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (!tagKey) {&lt;br /&gt;
      var evDateStr = Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;);&lt;br /&gt;
      var evTitle = ev.getTitle();&lt;br /&gt;
      var extractedVenue = &amp;quot;&amp;quot;;&lt;br /&gt;
      if (evTitle.indexOf(&amp;quot;VoYD played &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD played &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD plays &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD plays &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      else if (evTitle.indexOf(&amp;quot;VoYD might play &amp;quot;) === 0) extractedVenue = evTitle.replace(&amp;quot;VoYD might play &amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      tagKey = extractedVenue ? (evDateStr + &amp;quot;_&amp;quot; + extractedVenue) : (evDateStr + &amp;quot;_&amp;quot; + ev.getLocation());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var isManagedEvent = ev.getTag(&amp;quot;GIG_KEY&amp;quot;) || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD played &amp;quot;) === 0 || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD plays &amp;quot;) === 0 || &lt;br /&gt;
                         ev.getTitle().indexOf(&amp;quot;VoYD might play &amp;quot;) === 0;&lt;br /&gt;
    &lt;br /&gt;
    if (isManagedEvent &amp;amp;&amp;amp; !validSheetKeys[tagKey]) {&lt;br /&gt;
      Logger.log(&amp;quot;🗑️ Calendar Deleted (no longer in sheet/valid): &amp;quot; + ev.getTitle() + &amp;quot; on &amp;quot; + Utilities.formatDate(ev.getStartTime(), timeZone, &amp;quot;yyyy-MM-dd&amp;quot;));&lt;br /&gt;
      ev.deleteEvent();&lt;br /&gt;
      deletedCount++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // ==========================================&lt;br /&gt;
  // FINAL METRICS SUMMARY (Always Displays)&lt;br /&gt;
  // ==========================================&lt;br /&gt;
  Logger.log(&amp;quot;=========== FINAL PERFORMANCE SUMMARY ===========&amp;quot;);&lt;br /&gt;
  Logger.log(&amp;quot;📋 Total Data Rows Scanned: &amp;quot; + metrics.scanned);&lt;br /&gt;
  Logger.log(&amp;quot;🎉 Total Rows Accepted:     &amp;quot; + metrics.accepted);&lt;br /&gt;
  Logger.log(&amp;quot;🚫 Total Rows Filtered Out: &amp;quot; + metrics.rejected);&lt;br /&gt;
  Logger.log(&amp;quot;🗑️ Calendar Events Purged:  &amp;quot; + deletedCount);&lt;br /&gt;
  Logger.log(&amp;quot;=================================================&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1922</id>
		<title>Template:YTLink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1922"/>
		<updated>2026-05-06T10:40:30Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{YTLink|id=VIDEO_ID|text=DISPLAY_TEXT|time=TIMECODE|bracket=0_OR_1}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: The string after &amp;quot;v=&amp;quot; in the URL.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: The clickable text.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039; (optional): The timecode (e.g., 1m30s or 90).&lt;br /&gt;
* &#039;&#039;&#039;bracket&#039;&#039;&#039; (optional): Set to 1 to wrap the text in square brackets.&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;[https://www.youtube.com/watch?v={{{1|{{{id}}}}}}{{#if: {{{3|{{{time|}}}}}} | &amp;amp;t={{{3|{{{time}}}}}} }} {{#if: {{{4|{{{bracket|}}}}}} | [ | }}{{{2|{{{text}}}}}}{{#if: {{{4|{{{bracket|}}}}}} | &amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt; }}]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1921</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1921"/>
		<updated>2026-05-06T10:39:39Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Video References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video References==&lt;br /&gt;
&lt;br /&gt;
# Intro and definition of UV Mapping: {{YTLink|dm3bBpZVmnE|00:00|0|1}}  &lt;br /&gt;
# Step 1: Applying Scale: {{YTLink|dm3bBpZVmnE|02:24|144|1}}  &lt;br /&gt;
# Step 2: Project from View (Clean Slate): {{YTLink|dm3bBpZVmnE|03:18|198|1}}  &lt;br /&gt;
# Step 3: Marking Seams: {{YTLink|dm3bBpZVmnE|04:43|283|1}}  &lt;br /&gt;
# Blender 5.0 UV Sync Feature: {{YTLink|dm3bBpZVmnE|05:03|303|1}}  &lt;br /&gt;
# Step 4: Unwrapping (Conformal vs Angle-based): {{YTLink|dm3bBpZVmnE|05:44|344|1}}  &lt;br /&gt;
# Step 5: Packing Islands and Margins: {{YTLink|dm3bBpZVmnE|06:52|412|1}}  &lt;br /&gt;
# Using a UV Checker Map: {{YTLink|dm3bBpZVmnE|08:11|491|1}}  &lt;br /&gt;
# Visualizing UV Stretch (Distortion): {{YTLink|dm3bBpZVmnE|14:05|845|1}}  &lt;br /&gt;
# Marking Seams in the UV Editor: {{YTLink|dm3bBpZVmnE|17:14|1034|1}}  &lt;br /&gt;
# Pack to Custom Region: {{YTLink|dm3bBpZVmnE|22:42|1362|1}}  &lt;br /&gt;
# Using Tri-planar Mapping to hide seams: {{YTLink|dm3bBpZVmnE|26:21|1581|1}}&lt;br /&gt;
&lt;br /&gt;
== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|1}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry. {{YTLink|dm3bBpZVmnE|02:24|144s|1}}&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1920</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1920"/>
		<updated>2026-05-06T10:39:30Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Video References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video References==&lt;br /&gt;
&lt;br /&gt;
# Intro and definition of UV Mapping: {{YTLink|dm3bBpZVmnE|00:00|0|}}  &lt;br /&gt;
# Step 1: Applying Scale: {{YTLink|dm3bBpZVmnE|02:24|144|1}}  &lt;br /&gt;
# Step 2: Project from View (Clean Slate): {{YTLink|dm3bBpZVmnE|03:18|198|1}}  &lt;br /&gt;
# Step 3: Marking Seams: {{YTLink|dm3bBpZVmnE|04:43|283|1}}  &lt;br /&gt;
# Blender 5.0 UV Sync Feature: {{YTLink|dm3bBpZVmnE|05:03|303|1}}  &lt;br /&gt;
# Step 4: Unwrapping (Conformal vs Angle-based): {{YTLink|dm3bBpZVmnE|05:44|344|1}}  &lt;br /&gt;
# Step 5: Packing Islands and Margins: {{YTLink|dm3bBpZVmnE|06:52|412|1}}  &lt;br /&gt;
# Using a UV Checker Map: {{YTLink|dm3bBpZVmnE|08:11|491|1}}  &lt;br /&gt;
# Visualizing UV Stretch (Distortion): {{YTLink|dm3bBpZVmnE|14:05|845|1}}  &lt;br /&gt;
# Marking Seams in the UV Editor: {{YTLink|dm3bBpZVmnE|17:14|1034|1}}  &lt;br /&gt;
# Pack to Custom Region: {{YTLink|dm3bBpZVmnE|22:42|1362|1}}  &lt;br /&gt;
# Using Tri-planar Mapping to hide seams: {{YTLink|dm3bBpZVmnE|26:21|1581|1}}&lt;br /&gt;
&lt;br /&gt;
== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|1}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry. {{YTLink|dm3bBpZVmnE|02:24|144s|1}}&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1919</id>
		<title>Template:YTLink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1919"/>
		<updated>2026-05-06T10:39:13Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{YTLink|id=VIDEO_ID|text=DISPLAY_TEXT|time=TIMECODE|bracket=0_OR_1}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: The string after &amp;quot;v=&amp;quot; in the URL.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: The clickable text.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039; (optional): The timecode (e.g., 1m30s or 90).&lt;br /&gt;
* &#039;&#039;&#039;bracket&#039;&#039;&#039; (optional): Set to 1 to wrap the text in square brackets.&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;[https://www.youtube.com/watch?v={{{1|{{{id}}}}}}{{#if: {{{3|{{{time|}}}}}} | &amp;amp;t={{{3|{{{time}}}}}} }} {{#if: {{{4|{{{bracket|}}}}}} | [ | }}{{{2|{{{text}}}}}}{{#if: {{{4|{{{bracket|}}}}}} | ]}}]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1918</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1918"/>
		<updated>2026-05-06T10:38:03Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video References==&lt;br /&gt;
&lt;br /&gt;
# Intro and definition of UV Mapping: {{YTLink|dm3bBpZVmnE|00:00|0|1}}  &lt;br /&gt;
# Step 1: Applying Scale: {{YTLink|dm3bBpZVmnE|02:24|144|1}}  &lt;br /&gt;
# Step 2: Project from View (Clean Slate): {{YTLink|dm3bBpZVmnE|03:18|198|1}}  &lt;br /&gt;
# Step 3: Marking Seams: {{YTLink|dm3bBpZVmnE|04:43|283|1}}  &lt;br /&gt;
# Blender 5.0 UV Sync Feature: {{YTLink|dm3bBpZVmnE|05:03|303|1}}  &lt;br /&gt;
# Step 4: Unwrapping (Conformal vs Angle-based): {{YTLink|dm3bBpZVmnE|05:44|344|1}}  &lt;br /&gt;
# Step 5: Packing Islands and Margins: {{YTLink|dm3bBpZVmnE|06:52|412|1}}  &lt;br /&gt;
# Using a UV Checker Map: {{YTLink|dm3bBpZVmnE|08:11|491|1}}  &lt;br /&gt;
# Visualizing UV Stretch (Distortion): {{YTLink|dm3bBpZVmnE|14:05|845|1}}  &lt;br /&gt;
# Marking Seams in the UV Editor: {{YTLink|dm3bBpZVmnE|17:14|1034|1}}  &lt;br /&gt;
# Pack to Custom Region: {{YTLink|dm3bBpZVmnE|22:42|1362|1}}  &lt;br /&gt;
# Using Tri-planar Mapping to hide seams: {{YTLink|dm3bBpZVmnE|26:21|1581|1}}&lt;br /&gt;
&lt;br /&gt;
== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|1}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry. {{YTLink|dm3bBpZVmnE|02:24|144s|1}}&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1917</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1917"/>
		<updated>2026-05-06T10:35:20Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* 1. Apply Scale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|1}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry. {{YTLink|dm3bBpZVmnE|02:24|144s|1}}&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1916</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1916"/>
		<updated>2026-05-06T10:33:42Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* The Core UV Unwrapping Philosophy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|1}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry.&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1915</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1915"/>
		<updated>2026-05-06T10:33:27Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* The Core UV Unwrapping Philosophy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|1}} {{YTLink|dm3bBpZVmnE|00:44|44s|1}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry.&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1914</id>
		<title>Template:YTLink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1914"/>
		<updated>2026-05-06T10:30:42Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{YTLink|id=VIDEO_ID|text=DISPLAY_TEXT|time=TIMECODE|bracket=0_OR_1}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: The string after &amp;quot;v=&amp;quot; in the URL.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: The clickable text.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039; (optional): The timecode (e.g., 1m30s or 90).&lt;br /&gt;
* &#039;&#039;&#039;bracket&#039;&#039;&#039; (optional): Set to 1 to wrap the text in square brackets.&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;[https://www.youtube.com/watch?v={{{1|{{{id}}}}}}{{#if: {{{3|{{{time|}}}}}} | &amp;amp;t={{{3|{{{time}}}}}} }} {{#if: {{{4|{{{bracket|}}}}}} | [ | }}{{{2|{{{text}}}}}}{{#if: {{{4|{{{bracket|}}}}}} | ] | }}]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1913</id>
		<title>Template:YTLink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1913"/>
		<updated>2026-05-06T10:29:17Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{YTLink|id=VIDEO_ID|text=DISPLAY_TEXT|time=TIMECODE|bracket=0_OR_1}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: The string after &amp;quot;v=&amp;quot; in the URL.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: The clickable text.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039; (optional): The timecode (e.g., 1m30s or 90).&lt;br /&gt;
* &#039;&#039;&#039;bracket&#039;&#039;&#039; (optional): Set to 1 to wrap the text in square brackets.&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#if: {{{4|{{{bracket|}}}}}} | [ | }}[https://www.youtube.com/watch?v={{{1|{{{id}}}}}}{{#if: {{{3|{{{time|}}}}}} | &amp;amp;t={{{3|{{{time}}}}}} }} {{{2|{{{text}}}}}}]{{#if: {{{4|{{{bracket|}}}}}} | ] | }}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1912</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1912"/>
		<updated>2026-05-06T10:27:45Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* The Core UV Unwrapping Philosophy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|1}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry.&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1911</id>
		<title>Template:YTLink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1911"/>
		<updated>2026-05-06T10:26:18Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{YTLink|id=VIDEO_ID|text=DISPLAY_TEXT|time=TIMECODE|bracket=0_OR_1}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: The string after &amp;quot;v=&amp;quot; in the URL.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: The clickable text.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039; (optional): The timecode (e.g., 1m30s or 90).&lt;br /&gt;
* &#039;&#039;&#039;bracket&#039;&#039;&#039; (optional): Set to 1 to wrap the text in square brackets.&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#if: {{{bracket|}}} | [ | }}[https://www.youtube.com/watch?v={{{1|{{{id}}}}}}{{#if: {{{3|{{{time|}}}}}} | &amp;amp;t={{{3|{{{time}}}}}} }} {{{2|{{{text}}}}}}]{{#if: {{{bracket|}}} | ] | }}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1910</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1910"/>
		<updated>2026-05-06T10:22:35Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* The Core UV Unwrapping Philosophy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry.&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1909</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1909"/>
		<updated>2026-05-06T10:22:12Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* The Core UV Unwrapping Philosophy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s|1}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry.&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1908</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1908"/>
		<updated>2026-05-06T10:21:32Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat. {{YTLink|dm3bBpZVmnE|00:44|44s}}&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry.&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1907</id>
		<title>How to UV Unwrap Anything (Tutorial by @OnMars3d)</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=How_to_UV_Unwrap_Anything_(Tutorial_by_@OnMars3d)&amp;diff=1907"/>
		<updated>2026-05-06T10:19:19Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==  This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.   Video Reference: http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything  === The Core UV Unwrapping Philosophy === UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D imag...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Blender 5.0: How to UV Unwrap Anything (Tutorial by @OnMars3d) ==&lt;br /&gt;
&lt;br /&gt;
This tutorial provides a universal 5-step workflow for UV mapping in Blender 5.0, applicable to low-poly, hard-surface, and organic models.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video Reference: [[http://www.youtube.com/watch?v=dm3bBpZVmnE Blender 5.0: How to UV Unwrap Anything]]&lt;br /&gt;
&lt;br /&gt;
=== The Core UV Unwrapping Philosophy ===&lt;br /&gt;
UV mapping is the process of taking a 3D object (XYZ) and flattening it into a 2D coordinate system (UV) so a 2D image texture can be applied accurately. Think of it like unfolding a cardboard box or peeling an orange to lay it flat.&lt;br /&gt;
&lt;br /&gt;
=== The 5-Step Workflow ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Apply Scale ====&lt;br /&gt;
This is the most critical step to avoid rectangular or distorted textures.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Object Mode, select your objects.&lt;br /&gt;
* &#039;&#039;&#039;Shortcut:&#039;&#039;&#039; {{Shortcut|Ctrl|A}} &amp;gt; &#039;&#039;&#039;Scale&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This resets the object&#039;s transform to 1,1,1. Without this, Blender will &amp;quot;stretch&amp;quot; the UV unwrap based on the object&#039;s object-level scaling rather than its actual geometry.&lt;br /&gt;
&lt;br /&gt;
==== 2. Project from View (The &amp;quot;Clean Slate&amp;quot;) ====&lt;br /&gt;
Before placing seams, reset the UV map to clear messy default projections.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In Edit Mode, select all faces ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Project from View&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This cleans the UV Editor, providing a blank canvas so you aren&#039;t intimidated by overlapping edges while you work.&lt;br /&gt;
&lt;br /&gt;
==== 3. Mark Seams ====&lt;br /&gt;
Seams are the &amp;quot;cut lines&amp;quot; that tell Blender how to unfold the mesh.&lt;br /&gt;
* &#039;&#039;&#039;Strategy:&#039;&#039;&#039; Place seams at sharp corners, natural surface changes, or hidden areas (like the back of a cylinder).&lt;br /&gt;
* &#039;&#039;&#039;Shortcuts:&#039;&#039;&#039;&lt;br /&gt;
** {{Shortcut|Alt|Click}} to select edge loops.&lt;br /&gt;
** {{Shortcut|Ctrl|Click}} to select the shortest path between two edges.&lt;br /&gt;
** {{Shortcut|Right Click}} &amp;gt; &#039;&#039;&#039;Mark Seam&#039;&#039;&#039; (edges will turn red).&lt;br /&gt;
* &#039;&#039;&#039;Pro Tip:&#039;&#039;&#039; Use &#039;&#039;&#039;Select Sharp Edges&#039;&#039;&#039; (Select &amp;gt; Select Sharp Edges) to automatically highlight logical seam locations for hard-surface models.&lt;br /&gt;
&lt;br /&gt;
[Image of UV mapping seams on a 3D model]&lt;br /&gt;
&lt;br /&gt;
==== 4. Unwrap (Unfold) ====&lt;br /&gt;
Once seams are marked, flatten the mesh into islands.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; Select all ({{Shortcut|A}}), press {{Shortcut|U}} &amp;gt; &#039;&#039;&#039;Unwrap&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Methods:&#039;&#039;&#039; &lt;br /&gt;
** &#039;&#039;&#039;Conformal:&#039;&#039;&#039; Best for hard-surface/geometric objects.&lt;br /&gt;
** &#039;&#039;&#039;Angle-Based:&#039;&#039;&#039; Best for organic shapes (characters, animals).&lt;br /&gt;
&lt;br /&gt;
==== 5. Pack Islands ====&lt;br /&gt;
Arrange the &amp;quot;islands&amp;quot; so they fit efficiently within the UV tile without overlapping.&lt;br /&gt;
* &#039;&#039;&#039;Action:&#039;&#039;&#039; In the UV Editor, go to &#039;&#039;&#039;UV&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Pack Islands&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Margin:&#039;&#039;&#039; Set a small margin (e.g., 0.005) to create &amp;quot;padding.&amp;quot; Padding is vital to prevent &amp;quot;texture bleeding&amp;quot; at the edges of your islands.&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting &amp;amp; Tools ===&lt;br /&gt;
&lt;br /&gt;
==== Checking for Distortion ====&lt;br /&gt;
To ensure your textures won&#039;t look stretched or warped:&lt;br /&gt;
# &#039;&#039;&#039;UV Checker Map:&#039;&#039;&#039; In the UV Editor, click &#039;&#039;&#039;New&#039;&#039;&#039;, and set the Generated Type to &#039;&#039;&#039;UV Grid&#039;&#039;&#039;. Apply this in the Shading tab as your base color.&lt;br /&gt;
# &#039;&#039;&#039;Display Stretch:&#039;&#039;&#039; In the UV Editor overlays, enable &#039;&#039;&#039;Display Stretch&#039;&#039;&#039;.&lt;br /&gt;
#* &#039;&#039;&#039;Blue:&#039;&#039;&#039; No distortion.&lt;br /&gt;
#* &#039;&#039;&#039;Green/Red:&#039;&#039;&#039; High distortion; add more seams to these areas.&lt;br /&gt;
&lt;br /&gt;
[Image of UV checker map on a 3D object]&lt;br /&gt;
&lt;br /&gt;
==== New Blender 5.0 Features ====&lt;br /&gt;
* &#039;&#039;&#039;UV Sync Enabled by Default:&#039;&#039;&#039; Selecting a face in the 3D viewport now automatically highlights it in the UV Editor, and vice-versa.&lt;br /&gt;
* &#039;&#039;&#039;Pack to Custom Region:&#039;&#039;&#039; Draw a box ({{Shortcut|Ctrl|B}}) in the UV Editor and select &#039;&#039;&#039;Pack to Custom Region&#039;&#039;&#039; in the Pack Islands settings to isolate specific pieces.&lt;br /&gt;
* &#039;&#039;&#039;Mark Seams in UV Editor:&#039;&#039;&#039; You can now mark seams directly in the UV Editor window without switching focus to the 3D viewport.&lt;br /&gt;
&lt;br /&gt;
=== Handling Seams in Texturing ===&lt;br /&gt;
If seams are visible in your final texture, use &#039;&#039;&#039;Tri-planar Mapping&#039;&#039;&#039; (standard in software like Substance Painter or via Blender Shader Nodes). This projects the texture from three sides and blends the intersections, hiding the physical cut line.&lt;br /&gt;
&lt;br /&gt;
[[Category:Blender]]&lt;br /&gt;
[[Category:UV Mapping]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1906</id>
		<title>Template:YTLink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Template:YTLink&amp;diff=1906"/>
		<updated>2026-05-06T10:19:06Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;&amp;lt;noinclude&amp;gt; == Usage == {{YTLink|id=VIDEO_ID|text=DISPLAY_TEXT|time=TIMECODE|bracket=0_OR_1}}  * &amp;#039;&amp;#039;&amp;#039;id&amp;#039;&amp;#039;&amp;#039;: The string after &amp;quot;v=&amp;quot; in the URL. * &amp;#039;&amp;#039;&amp;#039;text&amp;#039;&amp;#039;&amp;#039;: The clickable text. * &amp;#039;&amp;#039;&amp;#039;time&amp;#039;&amp;#039;&amp;#039; (optional): The timecode (e.g., 1m30s or 90). * &amp;#039;&amp;#039;&amp;#039;bracket&amp;#039;&amp;#039;&amp;#039; (optional): Set to 1 to wrap the text in square brackets. Category:Templates &amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#if: {{{bracket|}}} | [ | }}[https://www.youtube.com/watch?v=({{{1|{{{id}}}}}}){{#if: {{{3|{{{time|}}}}}} | &amp;amp;t={{{3|{...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Usage ==&lt;br /&gt;
{{YTLink|id=VIDEO_ID|text=DISPLAY_TEXT|time=TIMECODE|bracket=0_OR_1}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;id&#039;&#039;&#039;: The string after &amp;quot;v=&amp;quot; in the URL.&lt;br /&gt;
* &#039;&#039;&#039;text&#039;&#039;&#039;: The clickable text.&lt;br /&gt;
* &#039;&#039;&#039;time&#039;&#039;&#039; (optional): The timecode (e.g., 1m30s or 90).&lt;br /&gt;
* &#039;&#039;&#039;bracket&#039;&#039;&#039; (optional): Set to 1 to wrap the text in square brackets.&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#if: {{{bracket|}}} | [ | }}[https://www.youtube.com/watch?v=({{{1|{{{id}}}}}}){{#if: {{{3|{{{time|}}}}}} | &amp;amp;t={{{3|{{{time}}}}}} }} {{{2|{{{text}}}}}}]{{#if: {{{bracket|}}} | ] | }}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Template:Shortcut&amp;diff=1905</id>
		<title>Template:Shortcut</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Template:Shortcut&amp;diff=1905"/>
		<updated>2026-05-06T10:12:29Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Template for displaying keyboard shortcuts with up to 4 keys.&lt;br /&gt;
Usage: {{shortcut|Ctrl|Alt|Del}}&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;span style=&amp;quot;display:inline-block; padding:0.2em 0.4em; font-family:inherit; font-size:0.85em; line-height:1; color:#333; background-color:#f7f7f7; border:1px solid #ccc; border-radius:0.2em; box-shadow:0.1em 0.1em 0.2em rgba(0,0,0,0.1); text-shadow:0 1px 0 #fff; white-space:nowrap;&amp;quot;&amp;gt;{{{1}}}{{#if:{{{2|}}}|&amp;amp;nbsp;+&amp;amp;nbsp;{{{2}}}}}{{#if:{{{3|}}}|&amp;amp;nbsp;+&amp;amp;nbsp;{{{3}}}}}{{#if:{{{4|}}}|&amp;amp;nbsp;+&amp;amp;nbsp;{{{4}}}}}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Template:Shortcut&amp;diff=1904</id>
		<title>Template:Shortcut</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Template:Shortcut&amp;diff=1904"/>
		<updated>2026-05-06T10:06:53Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;&amp;lt;noinclude&amp;gt; Template for displaying keyboard shortcuts with up to 4 keys. Usage: {{shortcut|Ctrl|Alt|Del}} Category:Templates &amp;lt;/noinclude&amp;gt;&amp;lt;span style=&amp;quot;     display: inline-block;     padding: 0.2em 0.4em;     font-family: inherit;     font-size: 0.85em;     line-height: 1;     color: #333;     background-color: #f7f7f7;     border: 1px solid #ccc;     border-radius: 0.2em;     box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1);     text-shadow: 0 1px 0 #fff;     white-spa...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Template for displaying keyboard shortcuts with up to 4 keys.&lt;br /&gt;
Usage: {{shortcut|Ctrl|Alt|Del}}&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;span style=&amp;quot;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.2em 0.4em;&lt;br /&gt;
    font-family: inherit;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
    line-height: 1;&lt;br /&gt;
    color: #333;&lt;br /&gt;
    background-color: #f7f7f7;&lt;br /&gt;
    border: 1px solid #ccc;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1);&lt;br /&gt;
    text-shadow: 0 1px 0 #fff;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
&amp;quot;&amp;gt;&lt;br /&gt;
{{{1}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{2|}}}|&amp;amp;nbsp;+&amp;amp;nbsp;{{{2}}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{3|}}}|&amp;amp;nbsp;+&amp;amp;nbsp;{{{3}}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{4|}}}|&amp;amp;nbsp;+&amp;amp;nbsp;{{{4}}}}}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=F1_Replay_Timing&amp;diff=1903</id>
		<title>F1 Replay Timing</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=F1_Replay_Timing&amp;diff=1903"/>
		<updated>2026-03-29T14:27:41Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* My Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:F1ReplayTiming-001.png|800px]]&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
=Background=&lt;br /&gt;
This weekend while boiling maple syrup, I decided to set up [https://github.com/adn8naiagent/F1ReplayTiming F1 Replay Timing] in a container to see how it went.&lt;br /&gt;
&lt;br /&gt;
It took a couple of attempts, some of it was coming up to speed on apps that referenced other apps and eventually I ended up with the following for docker compose.  It got passed the name resolution issue that plagued the first attempts.&lt;br /&gt;
=My Setup=&lt;br /&gt;
I am using Container Station on a QNAP NAS.  My older NAS was extremely slow in all phases of the setup and usage (so much so that I am considering offloading everything and burning it down to rebuild it).  Another beefier NAS with a fresh OS build handled this very well.  The download and setup times for each race is 60-120 seconds in my experience.&lt;br /&gt;
&lt;br /&gt;
You can trigger a race stats download by tagging the URL from the drop down selectors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format:&#039;&#039;&#039; /replay/YYYY/EVENT#/?type=EventCode&lt;br /&gt;
&lt;br /&gt;
{|class=&#039;wikitable&#039;&lt;br /&gt;
|-&lt;br /&gt;
!Event&lt;br /&gt;
!Code&lt;br /&gt;
|- &lt;br /&gt;
|Practice 1&lt;br /&gt;
|FP1&lt;br /&gt;
|- &lt;br /&gt;
|Practice 2&lt;br /&gt;
|FP2&lt;br /&gt;
|- &lt;br /&gt;
|Practice 3&lt;br /&gt;
|FP3&lt;br /&gt;
|- &lt;br /&gt;
|Qualifying&lt;br /&gt;
|Q&lt;br /&gt;
|- &lt;br /&gt;
|Sprint&lt;br /&gt;
|S&lt;br /&gt;
|- &lt;br /&gt;
|Sprint Qualifying&lt;br /&gt;
|SQ&lt;br /&gt;
|- &lt;br /&gt;
|Race&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Feature Request=&lt;br /&gt;
Window dressing requests that really aren&#039;t that important:&lt;br /&gt;
==Cached Marker==&lt;br /&gt;
It would be really nice if the front end event selector highlighted Green (or something) if the race was locally cached already.&lt;br /&gt;
==Caching Status==&lt;br /&gt;
When I was dealing with the slow NAS, I was watching the backend terminal queue go by and it was neat to see how the info was being downloaded.  At the time it was much longer than the 60 second warning on the screen, so I started thinking &amp;quot;wouldn&#039;t if be nice if...&amp;quot; and I thought that dividing one race track (or create a fictional track) with segments equal to the download stages (drivers, RC, etc) and having the section change to a highlighted color (like the Yellow Safety Car for example) as it downloads.&lt;br /&gt;
&lt;br /&gt;
=Results=&lt;br /&gt;
It worked pretty well.  I was able to watch the Suzuka race (Japan, 2026) in replay this morning and had the replay going on a computer screen.  It was very interesting to watch what happens beyond the eye of the broadcast camera.&lt;br /&gt;
&lt;br /&gt;
=Docker Compose=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  backend:&lt;br /&gt;
    image: ghcr.io/adn8naiagent/f1replaytiming-backend:latest&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;8000:8000&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - FRONTEND_URL=http://192.168.1.80:3000&lt;br /&gt;
      - DATA_DIR=/data&lt;br /&gt;
    volumes:&lt;br /&gt;
      - f1data:/data&lt;br /&gt;
      - f1cache:/data/fastf1-cache&lt;br /&gt;
    # Allows terminal attachment&lt;br /&gt;
    stdin_open: true&lt;br /&gt;
    tty: true&lt;br /&gt;
    # DNS Settings&lt;br /&gt;
    dns:&lt;br /&gt;
      - 8.8.8.8&lt;br /&gt;
      - 1.1.1.1&lt;br /&gt;
  frontend:&lt;br /&gt;
    image: ghcr.io/adn8naiagent/f1replaytiming-frontend:latest&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;3000:3000&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - NEXT_PUBLIC_API_URL=http://192.168.1.81:8000  # Change to your backend URL if not using localhost&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - backend&lt;br /&gt;
    # Allows terminal attachment&lt;br /&gt;
    stdin_open: true&lt;br /&gt;
    tty: true&lt;br /&gt;
    # DNS Settings&lt;br /&gt;
    dns:&lt;br /&gt;
      - 8.8.8.8&lt;br /&gt;
      - 1.1.1.1&lt;br /&gt;
volumes:&lt;br /&gt;
  f1data:&lt;br /&gt;
  f1cache:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:F1]]&lt;br /&gt;
[[Category:Docker]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=F1_Replay_Timing&amp;diff=1902</id>
		<title>F1 Replay Timing</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=F1_Replay_Timing&amp;diff=1902"/>
		<updated>2026-03-29T14:16:25Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;800px &amp;lt;HR&amp;gt; =Background= This weekend while boiling maple syrup, I decided to set up [https://github.com/adn8naiagent/F1ReplayTiming F1 Replay Timing] in a container to see how it went.  It took a couple of attempts, some of it was coming up to speed on apps that referenced other apps and eventually I ended up with the following for docker compose.  It got passed the name resolution issue that plagued the first attempts. =My Setup= I am usi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:F1ReplayTiming-001.png|800px]]&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
=Background=&lt;br /&gt;
This weekend while boiling maple syrup, I decided to set up [https://github.com/adn8naiagent/F1ReplayTiming F1 Replay Timing] in a container to see how it went.&lt;br /&gt;
&lt;br /&gt;
It took a couple of attempts, some of it was coming up to speed on apps that referenced other apps and eventually I ended up with the following for docker compose.  It got passed the name resolution issue that plagued the first attempts.&lt;br /&gt;
=My Setup=&lt;br /&gt;
I am using Container Station on a QNAP NAS.  My older NAS was extremely slow in all phases of the setup and usage (so much so that I am considering offloading everything and burning it down to rebuild it).  Another beefier NAS with a fresh OS build handled this very well.  The download and setup times for each race is 60-120 seconds in my experience.&lt;br /&gt;
&lt;br /&gt;
You can trigger a race stats download by tagging the URL ala /replay/2026/3?type=Q&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format:&#039;&#039;&#039; /replay/YYYY/EVENT#/?type=EventCode&lt;br /&gt;
&lt;br /&gt;
{|class=&#039;wikitable&#039;&lt;br /&gt;
|-&lt;br /&gt;
!Event&lt;br /&gt;
!Code&lt;br /&gt;
|- &lt;br /&gt;
|Practice 1&lt;br /&gt;
|FP1&lt;br /&gt;
|- &lt;br /&gt;
|Practice 2&lt;br /&gt;
|FP2&lt;br /&gt;
|- &lt;br /&gt;
|Practice 3&lt;br /&gt;
|FP3&lt;br /&gt;
|- &lt;br /&gt;
|Qualifying&lt;br /&gt;
|Q&lt;br /&gt;
|- &lt;br /&gt;
|Sprint&lt;br /&gt;
|S&lt;br /&gt;
|- &lt;br /&gt;
|Sprint Qualifying&lt;br /&gt;
|SQ&lt;br /&gt;
|- &lt;br /&gt;
|Race&lt;br /&gt;
|R&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Results=&lt;br /&gt;
It worked pretty well.  I was able to watch the Suzuka race (Japan, 2026) in replay this morning and had the replay going on a computer screen.  It was very interesting to watch what happens beyond the eye of the broadcast camera.&lt;br /&gt;
&lt;br /&gt;
=Docker Compose=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  backend:&lt;br /&gt;
    image: ghcr.io/adn8naiagent/f1replaytiming-backend:latest&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;8000:8000&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - FRONTEND_URL=http://192.168.1.80:3000&lt;br /&gt;
      - DATA_DIR=/data&lt;br /&gt;
    volumes:&lt;br /&gt;
      - f1data:/data&lt;br /&gt;
      - f1cache:/data/fastf1-cache&lt;br /&gt;
    # Allows terminal attachment&lt;br /&gt;
    stdin_open: true&lt;br /&gt;
    tty: true&lt;br /&gt;
    # DNS Settings&lt;br /&gt;
    dns:&lt;br /&gt;
      - 8.8.8.8&lt;br /&gt;
      - 1.1.1.1&lt;br /&gt;
  frontend:&lt;br /&gt;
    image: ghcr.io/adn8naiagent/f1replaytiming-frontend:latest&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;3000:3000&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - NEXT_PUBLIC_API_URL=http://192.168.1.81:8000  # Change to your backend URL if not using localhost&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - backend&lt;br /&gt;
    # Allows terminal attachment&lt;br /&gt;
    stdin_open: true&lt;br /&gt;
    tty: true&lt;br /&gt;
    # DNS Settings&lt;br /&gt;
    dns:&lt;br /&gt;
      - 8.8.8.8&lt;br /&gt;
      - 1.1.1.1&lt;br /&gt;
volumes:&lt;br /&gt;
  f1data:&lt;br /&gt;
  f1cache:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:F1]]&lt;br /&gt;
[[Category:Docker]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=File:F1ReplayTiming-001.png&amp;diff=1901</id>
		<title>File:F1ReplayTiming-001.png</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=File:F1ReplayTiming-001.png&amp;diff=1901"/>
		<updated>2026-03-29T14:06:14Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: File uploaded with MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File uploaded with MsUpload&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Joy_Thibodeau&amp;diff=1900</id>
		<title>Joy Thibodeau</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Joy_Thibodeau&amp;diff=1900"/>
		<updated>2026-01-09T14:20:58Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:AuntJoyThibodeau.jpg|right|thumb|Joy Thibodeau]]&lt;br /&gt;
Joy Elaine Thibodeau, 76, passed away peacefully at home in Winslow surrounded by her loving family. She was born in Providence, Rhode Island on May 14, 1949, to Gloria and Richard Bentley. Joy lived a life marked by dedication and love for her entire family and she had a knack for hard work. She built a career rooted in service and community. She worked at Colby College and the Villager Restaurant in the kitchen. Joy helped her husband, Arthur Thibodeau Sr. and her son Mark run the Thibs Taxi Company and Discount Cab Company. These endeavors reflected her commitment to supporting her family and others in the community.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Family was the heart of Joy’s world, and she had unconditional love for her family and grandkids. She is lovingly remembered by her husband, Arthur Thibodeau Sr., her children, Rusty and wife Karen Holt, Mark and his husband Mike Thibodeau, Michele Thibodeau and Tonya and her husband Shawn; her three sisters-in-law Janice Beane and her husband Alan, Gisele Thibodeau, and Sue Levasseur. She was a proud grandmother to Joseph Thibodeau, Sebastian Longo, Dwayne Scanlin, Savanna Scanlin, Star LaFrance and several step grandchildren. She also had a special place in her heart for her only great grandchild Wesley Hanscom.&lt;br /&gt;
She was predeceased by her parents Gloria and Richard Bentley, her stepfather Jessie, and her daughter Tina Thibodeau.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
She had unconditional love for her great grandson and grandchildren – second only to the deep love and affection she held for her children.&lt;br /&gt;
Joy found happiness in life’s simple pleasures. She loved traveling with her son Mark and his husband Mike. She visited Times Square in New York City, Miami, Florida, and took a cruise to Jamaica. She especially enjoyed all the camping trips that brought all the family closer together. Bingo nights were a favorite past time as well as crocheting, an art she embraced with care and creativity.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Her warmth touched many lives, and her memory will continue to bring comfort to those who knew her.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Family and friends are invited to attend visitation from 2:00 - 4:00 PM and 6:00 - 8:00 PM on January 9th, 2026, at Gallant Funeral Home, 10 Elm Street, Waterville, Maine. A Celebration of Life will be held at Gallant Funeral Home on January 10th at 11:00 AM. Please arrive around 10:00 AM.&lt;br /&gt;
&lt;br /&gt;
[[Category:Family]]&lt;br /&gt;
[[Category:Obituaries]]&lt;br /&gt;
[[Category:Weblog-2026-01]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=File:AuntJoyThibodeau.jpg&amp;diff=1899</id>
		<title>File:AuntJoyThibodeau.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=File:AuntJoyThibodeau.jpg&amp;diff=1899"/>
		<updated>2026-01-09T14:20:04Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Category:Family&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
[[Category:Family]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=James_Thibodeau&amp;diff=1898</id>
		<title>James Thibodeau</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=James_Thibodeau&amp;diff=1898"/>
		<updated>2026-01-09T14:13:11Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;I found today that I don&amp;#039;t have an obituary for my uncle Jimmy.  He was the twin of my mother, Janice Thibodeau, and husband to my aunt Gisele Thibodeau.   Category:Family Category:Obituaries Category:Weblog-2026-01&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I found today that I don&#039;t have an obituary for my uncle Jimmy.  He was the twin of my mother, Janice Thibodeau, and husband to my aunt Gisele Thibodeau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Family]]&lt;br /&gt;
[[Category:Obituaries]]&lt;br /&gt;
[[Category:Weblog-2026-01]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Dorothy_Thibodeau&amp;diff=1897</id>
		<title>Dorothy Thibodeau</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Dorothy_Thibodeau&amp;diff=1897"/>
		<updated>2026-01-09T14:11:30Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dorothy M. (Weaver) Thibodeau, 80, formerly of Seton Village, died Wednesday, Nov. 22, 2006, surrounded by her family, at Oak Grove Living and Rehabilitation Center in Waterville. She was born Nov. 8, 1926, in Greenbrier, Tenn., a daughter of Sally (Grubbs) and Gillie Weaver Sr.&lt;br /&gt;
&lt;br /&gt;
While working at Union Station in Nashville, Tenn., she met [[Joseph Thibodeau Jr.]] from Fairfield and later married him in Kentucky on Dec. 11, 1944.&lt;br /&gt;
In July 1954 they moved to Fairfield where they raised their six children. She also worked at Joy&#039;s Florist in Nashville, Laverdiere&#039;s Drug Store in Waterville, Greenlaw&#039;s Restaurant in Fairfield, W.T. Grant&#039;s at Elm Plaza, Colby College Dining Service in Waterville, and for a few years with her husband owned and operated Thib&#039;s Taxi in Fairfield.&lt;br /&gt;
&lt;br /&gt;
She loved to bowl and was a member of the local bowling lanes for 32 years, and was past president and secretary of the Tuesday and Sunday Night League. She was an officer in the State Bowling Association and was the first woman to be inducted into Waterville&#039;s U.S. Bowling Association Hall of Fame. She lived at Seton Village for 16 years and was the president of the Resident Council for eight consecutive years until her health forced her to stop.&lt;br /&gt;
&lt;br /&gt;
She was predeceased by her parents; husband of 43 years; son, [[James Thibodeau]]; granddaughter, Lisa Marie Levasseur; five brothers, Carney, Gillie, Frank, Thomas and Bobby Weaver; and two sisters, Frances Bedwell and Evie Lou Eanes. She is survived by three daughters, [[Frances York]] and husband, Charles, Camellia Levasseur and husband, [[Paul Levasseur Sr.|Paul]], and Janice Beane and husband, Alan, all of Benton; two sons, [[Joseph Thibodeau III]] and wife Theresa of Marydel, Del., and Arthur Thibodeau Sr. and wife, [[Joy Thibodeau|Joy]], of Waterville; a daughter-in-law, Gisele Thibodeau of Hollis; 15&lt;br /&gt;
grandchildren; one stepgrandson; 20 great-grandchildren; four stepgreat-grandchildren; a sister, Lillian White of Greenbrier, Tenn.; and a brother, Billy Weaver and wife Helen of Madison, Tenn.&lt;br /&gt;
&lt;br /&gt;
Family and friends are invited for visitation from 2 to 4 and 7 to 9 p.m. Friday, Nov. 24, at Gallant Funeral Home, 10 Elm St., Waterville. Funeral services will be held at 10 a.m. Saturday, Nov. 25, at Faith Evangelical Free Church, Kennedy Memorial Drive, Waterville. Interment will take place at the Maine Veterans Memorial Cemetery in Augusta. In lieu of flowers, memorial contributions may be made to Seton Village Resident Council, c/o Jackie Varney, 1 Carver St., Box 121, Waterville, ME 04901.&lt;br /&gt;
&lt;br /&gt;
Special thanks to Jackie Varney, a close friend for many years, the Dialysis Unit at MaineGeneral Medical Center, Thayer Unit, and to the staff at Oak Grove Living and Rehabilitation Center.&lt;br /&gt;
&lt;br /&gt;
[[Category:Family]]&lt;br /&gt;
[[Category:Obituaries]]&lt;br /&gt;
[[Category:Weblog-2006-11]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Category:Weblog-2026-01&amp;diff=1896</id>
		<title>Category:Weblog-2026-01</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Category:Weblog-2026-01&amp;diff=1896"/>
		<updated>2026-01-07T23:04:58Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Blog]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Category:Weblog-2026-01&amp;diff=1895</id>
		<title>Category:Weblog-2026-01</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Category:Weblog-2026-01&amp;diff=1895"/>
		<updated>2026-01-07T23:04:17Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;Category:Weblog&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Weblog]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Joy_Thibodeau&amp;diff=1894</id>
		<title>Joy Thibodeau</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Joy_Thibodeau&amp;diff=1894"/>
		<updated>2026-01-07T23:03:53Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;Joy Elaine Thibodeau, 76, passed away peacefully at home in Winslow surrounded by her loving family. She was born in Providence, Rhode Island on May 14, 1949, to Gloria and Richard Bentley. Joy lived a life marked by dedication and love for her entire family and she had a knack for hard work. She built a career rooted in service and community. She worked at Colby College and the Villager Restaurant in the kitchen. Joy helped her husband, Arthur Thibodeau Sr. and her son...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joy Elaine Thibodeau, 76, passed away peacefully at home in Winslow surrounded by her loving family. She was born in Providence, Rhode Island on May 14, 1949, to Gloria and Richard Bentley. Joy lived a life marked by dedication and love for her entire family and she had a knack for hard work. She built a career rooted in service and community. She worked at Colby College and the Villager Restaurant in the kitchen. Joy helped her husband, Arthur Thibodeau Sr. and her son Mark run the Thibs Taxi Company and Discount Cab Company. These endeavors reflected her commitment to supporting her family and others in the community.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Family was the heart of Joy’s world, and she had unconditional love for her family and grandkids. She is lovingly remembered by her husband, Arthur Thibodeau Sr., her children, Rusty and wife Karen Holt, Mark and his husband Mike Thibodeau, Michele Thibodeau and Tonya and her husband Shawn; her three sisters-in-law Janice Beane and her husband Alan, Gisele Thibodeau, and Sue Levasseur. She was a proud grandmother to Joseph Thibodeau, Sebastian Longo, Dwayne Scanlin, Savanna Scanlin, Star LaFrance and several step grandchildren. She also had a special place in her heart for her only great grandchild Wesley Hanscom.&lt;br /&gt;
She was predeceased by her parents Gloria and Richard Bentley, her stepfather Jessie, and her daughter Tina Thibodeau.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
She had unconditional love for her great grandson and grandchildren – second only to the deep love and affection she held for her children.&lt;br /&gt;
Joy found happiness in life’s simple pleasures. She loved traveling with her son Mark and his husband Mike. She visited Times Square in New York City, Miami, Florida, and took a cruise to Jamaica. She especially enjoyed all the camping trips that brought all the family closer together. Bingo nights were a favorite past time as well as crocheting, an art she embraced with care and creativity.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Her warmth touched many lives, and her memory will continue to bring comfort to those who knew her.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Family and friends are invited to attend visitation from 2:00 - 4:00 PM and 6:00 - 8:00 PM on January 9th, 2026, at Gallant Funeral Home, 10 Elm Street, Waterville, Maine. A Celebration of Life will be held at Gallant Funeral Home on January 10th at 11:00 AM. Please arrive around 10:00 AM.&lt;br /&gt;
&lt;br /&gt;
[[Category:Family]]&lt;br /&gt;
[[Category:Obituaries]]&lt;br /&gt;
[[Category:Weblog-2026-01]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Dorothy_Thibodeau&amp;diff=1893</id>
		<title>Dorothy Thibodeau</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Dorothy_Thibodeau&amp;diff=1893"/>
		<updated>2026-01-07T23:02:48Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dorothy M. (Weaver) Thibodeau, 80, formerly of Seton Village, died Wednesday, Nov. 22, 2006, surrounded by her family, at Oak Grove Living and Rehabilitation Center in Waterville. She was born Nov. 8, 1926, in Greenbrier, Tenn., a daughter of Sally (Grubbs) and Gillie Weaver Sr.&lt;br /&gt;
&lt;br /&gt;
While working at Union Station in Nashville, Tenn., she met [[Joseph Thibodeau Jr.]] from Fairfield and later married him in Kentucky on Dec. 11, 1944.&lt;br /&gt;
In July 1954 they moved to Fairfield where they raised their six children. She also worked at Joy&#039;s Florist in Nashville, Laverdiere&#039;s Drug Store in Waterville, Greenlaw&#039;s Restaurant in Fairfield, W.T. Grant&#039;s at Elm Plaza, Colby College Dining Service in Waterville, and for a few years with her husband owned and operated Thib&#039;s Taxi in Fairfield.&lt;br /&gt;
&lt;br /&gt;
She loved to bowl and was a member of the local bowling lanes for 32 years, and was past president and secretary of the Tuesday and Sunday Night League. She was an officer in the State Bowling Association and was the first woman to be inducted into Waterville&#039;s U.S. Bowling Association Hall of Fame. She lived at Seton Village for 16 years and was the president of the Resident Council for eight consecutive years until her health forced her to stop.&lt;br /&gt;
&lt;br /&gt;
She was predeceased by her parents; husband of 43 years; son, James Thibodeau; granddaughter, Lisa Marie Levasseur; five brothers, Carney, Gillie, Frank, Thomas and Bobby Weaver; and two sisters, Frances Bedwell and Evie Lou Eanes. She is survived by three daughters, [[Frances York]] and husband, Charles, Camellia Levasseur and husband, [[Paul Levasseur Sr.|Paul]], and Janice Beane and husband, Alan, all of Benton; two sons, [[Joseph Thibodeau III]] and wife Theresa of Marydel, Del., and Arthur Thibodeau Sr. and wife, [[Joy Thibodeau|Joy]], of Waterville; a daughter-in-law, Gisele Thibodeau of Hollis; 15&lt;br /&gt;
grandchildren; one stepgrandson; 20 great-grandchildren; four stepgreat-grandchildren; a sister, Lillian White of Greenbrier, Tenn.; and a brother, Billy Weaver and wife Helen of Madison, Tenn.&lt;br /&gt;
&lt;br /&gt;
Family and friends are invited for visitation from 2 to 4 and 7 to 9 p.m. Friday, Nov. 24, at Gallant Funeral Home, 10 Elm St., Waterville. Funeral services will be held at 10 a.m. Saturday, Nov. 25, at Faith Evangelical Free Church, Kennedy Memorial Drive, Waterville. Interment will take place at the Maine Veterans Memorial Cemetery in Augusta. In lieu of flowers, memorial contributions may be made to Seton Village Resident Council, c/o Jackie Varney, 1 Carver St., Box 121, Waterville, ME 04901.&lt;br /&gt;
&lt;br /&gt;
Special thanks to Jackie Varney, a close friend for many years, the Dialysis Unit at MaineGeneral Medical Center, Thayer Unit, and to the staff at Oak Grove Living and Rehabilitation Center.&lt;br /&gt;
&lt;br /&gt;
[[Category:Family]]&lt;br /&gt;
[[Category:Obituaries]]&lt;br /&gt;
[[Category:Weblog-2006-11]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1892</id>
		<title>VoYD</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1892"/>
		<updated>2025-12-20T17:01:34Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gigs=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vS3fepEaCnI1XjzccsC7SXo5Dno9X6jm9Ghy7ubFGn9BAleei9UiFG3L8lFoSh6xmEpiqH8OiIRLVIG/pubhtml?gid=2044986723&amp;amp;single=true Calendar Output]&lt;br /&gt;
* https://bit.ly/VoYDCalendar&lt;br /&gt;
&lt;br /&gt;
=Set List Mirror=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vQuDii0jPXrJPLGpp7I5wUEK6LWnRiEbuTezg-jLlTTVCzW63hOKYSgT3hzkxquQGcSYx3Hgk5VM0MI/pubhtml#gid=0 3 Sets]&lt;br /&gt;
* https://bit.ly/VoYD3&lt;br /&gt;
[[Category:VoYD]]&lt;br /&gt;
[[Category:Music]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Symlink&amp;diff=1891</id>
		<title>Symlink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Symlink&amp;diff=1891"/>
		<updated>2025-11-24T11:13:56Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Powershell */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Windows]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\Windows\system32&amp;gt;mklink /J &amp;quot;C:\GAMES&amp;quot; &amp;quot;D:\GAMES&amp;quot;&lt;br /&gt;
Junction created for C:\GAMES &amp;lt;&amp;lt;===&amp;gt;&amp;gt; D:\GAMES&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:\&amp;lt;sim&amp;gt; &amp;lt;&amp;lt;===&amp;gt;&amp;gt; D:\&amp;lt;actual target with files\folders&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=List=&lt;br /&gt;
&amp;lt;pre&amp;gt;dir /AL /S C:\ | find &amp;quot;SYMLINK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Powershell==&lt;br /&gt;
&amp;lt;pre&amp;gt;Get-ChildItem -Path C:\ -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -ne $null -and $_.LinkType -ne &#039;HardLink&#039; } | Out-File -FilePath C:\Users\username\Desktop\Symlinks_and_Junctions.txt -Encoding UTF8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Symlink&amp;diff=1890</id>
		<title>Symlink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Symlink&amp;diff=1890"/>
		<updated>2025-11-24T00:30:50Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Powershell */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Windows]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\Windows\system32&amp;gt;mklink /J &amp;quot;C:\GAMES&amp;quot; &amp;quot;D:\GAMES&amp;quot;&lt;br /&gt;
Junction created for C:\GAMES &amp;lt;&amp;lt;===&amp;gt;&amp;gt; D:\GAMES&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:\&amp;lt;sim&amp;gt; &amp;lt;&amp;lt;===&amp;gt;&amp;gt; D:\&amp;lt;actual target with files\folders&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=List=&lt;br /&gt;
&amp;lt;pre&amp;gt;dir /AL /S C:\ | find &amp;quot;SYMLINK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Powershell==&lt;br /&gt;
&amp;lt;pre&amp;gt;Get-ChildItem -Path C:\ -Recurse -Force -ErrorAction SilentlyContinue |&lt;br /&gt;
    Where-Object { $_.LinkType -ne $null -and $_.LinkType -ne &#039;HardLink&#039; } |&lt;br /&gt;
    Select-Object FullName, LinkType, Target |&lt;br /&gt;
    Format-Table -AutoSize |&lt;br /&gt;
    Out-String -Width 4096 |&lt;br /&gt;
    Out-File -FilePath C:\Users\YourUser\Desktop\Symlinks_Full_Paths.txt -Encoding UTF8&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Symlink&amp;diff=1889</id>
		<title>Symlink</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Symlink&amp;diff=1889"/>
		<updated>2025-11-24T00:27:59Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Windows]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\Windows\system32&amp;gt;mklink /J &amp;quot;C:\GAMES&amp;quot; &amp;quot;D:\GAMES&amp;quot;&lt;br /&gt;
Junction created for C:\GAMES &amp;lt;&amp;lt;===&amp;gt;&amp;gt; D:\GAMES&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C:\&amp;lt;sim&amp;gt; &amp;lt;&amp;lt;===&amp;gt;&amp;gt; D:\&amp;lt;actual target with files\folders&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=List=&lt;br /&gt;
&amp;lt;pre&amp;gt;dir /AL /S C:\ | find &amp;quot;SYMLINK&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Powershell==&lt;br /&gt;
&amp;lt;pre&amp;gt;Get-ChildItem -Path C:\ -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -ne $null -and $_.LinkType -ne &#039;HardLink&#039; } | Select-Object FullName, LinkType, Target | Out-File -FilePath C:\Users\YourName\Desktop\Symlinks.txt -Encoding UTF8&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1888</id>
		<title>VoYD</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1888"/>
		<updated>2025-10-03T12:13:11Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gigs=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vS3fepEaCnI1XjzccsC7SXo5Dno9X6jm9Ghy7ubFGn9BAleei9UiFG3L8lFoSh6xmEpiqH8OiIRLVIG/pubhtml?gid=2044986723&amp;amp;single=true Calendar Output]&lt;br /&gt;
&lt;br /&gt;
=Set List Mirror=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vQuDii0jPXrJPLGpp7I5wUEK6LWnRiEbuTezg-jLlTTVCzW63hOKYSgT3hzkxquQGcSYx3Hgk5VM0MI/pubhtml#gid=0 3 Sets]&lt;br /&gt;
&lt;br /&gt;
[[Category:VoYD]]&lt;br /&gt;
[[Category:Music]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Behringer_P16-HQ&amp;diff=1887</id>
		<title>Behringer P16-HQ</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Behringer_P16-HQ&amp;diff=1887"/>
		<updated>2025-08-16T19:17:22Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Reset all the channels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:BehringerPD16HQ.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
P16-HQ&lt;br /&gt;
&lt;br /&gt;
=Mixer Channels=&lt;br /&gt;
# DRUMS&lt;br /&gt;
# FRIED CHICKEN&lt;br /&gt;
# KEYBOARD&lt;br /&gt;
# BASS&lt;br /&gt;
# GTR L - DAVIS&lt;br /&gt;
# GTR R - DAVIS&lt;br /&gt;
# GTR L - MIKE&lt;br /&gt;
# GTR R - MIKE&lt;br /&gt;
# VOX - MIKE&lt;br /&gt;
# VOX - RED FX&lt;br /&gt;
# VOX - RED&lt;br /&gt;
# VOX - BUNK&lt;br /&gt;
# VOX - DAVIS&lt;br /&gt;
# TRACK L&lt;br /&gt;
# TRACK R&lt;br /&gt;
# CLICK&lt;br /&gt;
# LINE IN L&lt;br /&gt;
# LINE IN R&lt;br /&gt;
&lt;br /&gt;
=Reset all the channels=&lt;br /&gt;
RECALL + STORE + MAIN&lt;br /&gt;
(sets volume to 0)&lt;br /&gt;
&lt;br /&gt;
=Store Channels=&lt;br /&gt;
STORE + CHANNEL NUM (2nd tap num)&lt;br /&gt;
&lt;br /&gt;
=Select Stored Channel=&lt;br /&gt;
RECALL + CHANNEL NUM&lt;br /&gt;
&lt;br /&gt;
=Buttons=&lt;br /&gt;
==RECALL==&lt;br /&gt;
* 01. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to load the corresponding user mix preset.&lt;br /&gt;
==STORE==&lt;br /&gt;
* 02. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to save your current settings to the corresponding user mix preset slot.&lt;br /&gt;
==MAIN==&lt;br /&gt;
* 03. button selects the main stereo mix, which has its own settings for volume, balance, and equalization.&lt;br /&gt;
==ULTRANET==&lt;br /&gt;
* 04. LED lights to indicate the ULTRANET input is connected and active.&lt;br /&gt;
==LINK==&lt;br /&gt;
* 05. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to combine adjacent mono channels into a linked stereo pair.&lt;br /&gt;
==GROUP==&lt;br /&gt;
* 06. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to combine any selected channels into one or more groups.&lt;br /&gt;
==SOLO==&lt;br /&gt;
* 07. button mutes all channels except for the selected mono channel or stereo-linked pair.&lt;br /&gt;
==MUTE==&lt;br /&gt;
* 08. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to mute or unmute that channel.&lt;br /&gt;
==TREBLE==&lt;br /&gt;
* 09. knob controls the high band gain for the selected mono channel, stereo-linked pair, or MAIN stereo bus signal. Press the encoder to reset its value.&lt;br /&gt;
==MID==&lt;br /&gt;
* 10. knob controls the mid band gain for the currently selected mono channel, stereo-linked pair, or MAIN stereo bus signal. Press the encoder to reset its value.&lt;br /&gt;
==FREQ==&lt;br /&gt;
* 11. knob selects the specific mid-range frequency band to be cut or boosted using the MID knob. Press the encoder to reset its value.&lt;br /&gt;
==BASS==&lt;br /&gt;
* 12. knob controls the low band gain for the selected mono channel, stereolinked pair, or MAIN stereo bus signal. Press the encoder to reset its value.&lt;br /&gt;
==PANORAMA==&lt;br /&gt;
* 13. knob adjusts the stereo placement of mono channels and the relative left-right balance of stereo-linked channels or the MAIN stereo bus signal. Press the encoder to reset its value.&lt;br /&gt;
==VOLUME==&lt;br /&gt;
* 14. knob adjusts the mix level for selected mono and stereo-linked channels or the MAIN stereo bus signal. Press the encoder to mute.&lt;br /&gt;
==OUTPUT==&lt;br /&gt;
* 15. knob controls the overall master output level.&lt;br /&gt;
==GR LED==&lt;br /&gt;
* 16. lights to show when the output limiter is active.&lt;br /&gt;
==LIMITER==&lt;br /&gt;
* 17. knob controls the limiter threshold for the master output.&lt;br /&gt;
==CHANNEL SELECT==&lt;br /&gt;
* 18. buttons focus the desired mono and stereo-linked channels and groups for individual mix adjustment.&lt;br /&gt;
==DC IN==&lt;br /&gt;
* 19. connects to the included external power supply. Please use only BEHRINGER external power supplies.&lt;br /&gt;
==ON/OFF==&lt;br /&gt;
* 20. Duh switch.&lt;br /&gt;
==ULTRANET THRU==&lt;br /&gt;
* 21. sends an unprocessed copy of the ULTRANET IN to additional ULTRANET devices.&lt;br /&gt;
==ULTRANET IN==&lt;br /&gt;
* 22. receives 16 channels from ULTRANET devices over a shielded CAT5 digital audio cable.&lt;br /&gt;
==MIDI IN==&lt;br /&gt;
* 23. for control of all parameters using external MIDI controllers, as well as for firmware updates.&lt;br /&gt;
==LINE OUT==&lt;br /&gt;
* 24. transmits a copy of the MAIN stereo mix over two TRS cables. Alternatively, a single TRS cable can be connected to the L/MONO jack.&lt;br /&gt;
==PHONES==&lt;br /&gt;
* 25. output transmits a copy of the MAIN stereo mix over a 6.35 mm (1/4&amp;quot;) TRS connector.&lt;br /&gt;
&lt;br /&gt;
=P16-HQ Basic Setup=&lt;br /&gt;
# Turn the OUTPUT knob all the way down to the full&lt;br /&gt;
counterclockwise position.&lt;br /&gt;
# Turn the LIMITER knob all the way up to the full clockwise position.&lt;br /&gt;
# Confirm that the ULTRANET LED is lit.&lt;br /&gt;
# The parameters for each individual channel can be adjusted by pressing the corresponding CHANNEL SELECT button.  The LED in each CHANNEL SELECT button lights as follows:&lt;br /&gt;
#* Green (flickering): audio signal activity&lt;br /&gt;
#* Red (constant): mono channel or stereo-linked pair selected without audio signal activity&lt;br /&gt;
#* Yellow (flickering): mono channel or stereo-linked pair selected with audio signal activity&lt;br /&gt;
#* Red (blinking): the channel is part of the selected group, but the channel is currently not selected and there is no audio signal activity&lt;br /&gt;
#* Yellow (blinking): the channel is part of the selected group, but the channel is currently not selected and there is audio signal activity&lt;br /&gt;
# While playing audio, slowly turn the OUTPUT knob clockwise until you have a comfortable monitoring level.&lt;br /&gt;
# Slowly turn the LIMITER knob counterclockwise to get the limiter working and find an acceptable balance between dynamics and control of volume peaks.&lt;br /&gt;
# To adjust any individual or stereo channel in the mix, press the corresponding CHANNEL SELECT button. The channel’s LED will light red indicating the channel is selected for adjustment.&lt;br /&gt;
# Turn the VOLUME knob clockwise or counterclockwise to adjust the channel’s relative level in the mix.&lt;br /&gt;
# Turn the PANORAMA knob clockwise or counterclockwise to adjust the channel’s position in the stereo field.&lt;br /&gt;
# Adjust the channel’s low and high bands gain using the BASS and TREBLE knobs.&lt;br /&gt;
# Select the mid band center frequency for adjustment using the FREQ knob, and then adjust the mid band gain using the MID knob.&lt;br /&gt;
# Create stereo links by holding down the LINK button and then pressing the desired CHANNEL SELECT button. The related adjacent channel will become stereo-linked. Note that channels are always stereo-linked starting with an odd-numbered channel and assigning the odd-numbered channel to the left. All parameter values applied to the odd-numbered channel will be applied to both stereo-linked channels. &lt;br /&gt;
# To group several channels together, hold down the GROUP button, and then press the CHANNEL SELECT buttons of the channels you want to assign to the group. The LEDs for the selected channels will blink. Press the same CHANNEL SELECT button again to deselect the channel. Release the GROUP button to create the group with your selection of channels.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
After creating a group, it can be modified by holding down the GROUP button and pressing one of the CHANNEL SELECTION buttons assigned to the group. Now, channels can be added or removed from that group. &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
To create a  new group from the remaining unassigned channels, hold down the GROUP button and then press the CHANNEL SELECT button on a channel that is not currently assigned to a group (LED is off). Pressing an unassigned CHANNEL SELECT button opens a new group. Add more channels as desired.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
A channel can only be part of one group at the same time.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Adjusting the VOLUME of any channel within the group will modify the VOLUME of all the other grouped channels by the same amount. All other channel settings like EQ and PANORAMA remain independent.&lt;br /&gt;
# To mute one or multiple channels, hold down the MUTE button and then press the CHANNEL SELECT buttons on the desired channels.&lt;br /&gt;
# To solo the selected channel, press the SOLO button. Pressing another CHANNEL SELECTED button will solo the newly selected channel. To exit solo mode, press the SOLO button again.&lt;br /&gt;
# Save your settings to a preset by holding the STORE button and then select the target preset slot by pressing any one of the &lt;br /&gt;
# CHANNEL SELECT buttons.&lt;br /&gt;
# Load a preset by holding the RECALL button and pressing the CHANNEL SELECT button containing the desired preset.&lt;br /&gt;
&lt;br /&gt;
[[Category:Music]]&lt;br /&gt;
[[Category:VoYD]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=File:BehringerPD16HQ.png&amp;diff=1886</id>
		<title>File:BehringerPD16HQ.png</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=File:BehringerPD16HQ.png&amp;diff=1886"/>
		<updated>2025-08-16T19:08:25Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Category:Music
Category:VoYD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
[[Category:Music]]&lt;br /&gt;
[[Category:VoYD]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Behringer_P16-HQ&amp;diff=1885</id>
		<title>Behringer P16-HQ</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Behringer_P16-HQ&amp;diff=1885"/>
		<updated>2025-08-16T19:07:52Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;File:BehringerPD16HQ.png   P16-HQ  =Reset all the channels= RECALL + STORE + MAIN (sets volume to 0) =Store Channels= STORE + CHANNEL NUM (2nd tap num)  =Select Stored Channel= RECALL + CHANNEL NUM  =Buttons= ==RECALL== * 01. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to load the corresponding user mix preset. ==STORE== * 02. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to save your current settings to the correspondi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:BehringerPD16HQ.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
P16-HQ&lt;br /&gt;
&lt;br /&gt;
=Reset all the channels=&lt;br /&gt;
RECALL + STORE + MAIN&lt;br /&gt;
(sets volume to 0)&lt;br /&gt;
=Store Channels=&lt;br /&gt;
STORE + CHANNEL NUM (2nd tap num)&lt;br /&gt;
&lt;br /&gt;
=Select Stored Channel=&lt;br /&gt;
RECALL + CHANNEL NUM&lt;br /&gt;
&lt;br /&gt;
=Buttons=&lt;br /&gt;
==RECALL==&lt;br /&gt;
* 01. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to load the corresponding user mix preset.&lt;br /&gt;
==STORE==&lt;br /&gt;
* 02. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to save your current settings to the corresponding user mix preset slot.&lt;br /&gt;
==MAIN==&lt;br /&gt;
* 03. button selects the main stereo mix, which has its own settings for volume, balance, and equalization.&lt;br /&gt;
==ULTRANET==&lt;br /&gt;
* 04. LED lights to indicate the ULTRANET input is connected and active.&lt;br /&gt;
==LINK==&lt;br /&gt;
* 05. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to combine adjacent mono channels into a linked stereo pair.&lt;br /&gt;
==GROUP==&lt;br /&gt;
* 06. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to combine any selected channels into one or more groups.&lt;br /&gt;
==SOLO==&lt;br /&gt;
* 07. button mutes all channels except for the selected mono channel or stereo-linked pair.&lt;br /&gt;
==MUTE==&lt;br /&gt;
* 08. Hold this button and press one of the 16 CHANNEL SELECT buttons (18) to mute or unmute that channel.&lt;br /&gt;
==TREBLE==&lt;br /&gt;
* 09. knob controls the high band gain for the selected mono channel, stereo-linked pair, or MAIN stereo bus signal. Press the encoder to reset its value.&lt;br /&gt;
==MID==&lt;br /&gt;
* 10. knob controls the mid band gain for the currently selected mono channel, stereo-linked pair, or MAIN stereo bus signal. Press the encoder to reset its value.&lt;br /&gt;
==FREQ==&lt;br /&gt;
* 11. knob selects the specific mid-range frequency band to be cut or boosted using the MID knob. Press the encoder to reset its value.&lt;br /&gt;
==BASS==&lt;br /&gt;
* 12. knob controls the low band gain for the selected mono channel, stereolinked pair, or MAIN stereo bus signal. Press the encoder to reset its value.&lt;br /&gt;
==PANORAMA==&lt;br /&gt;
* 13. knob adjusts the stereo placement of mono channels and the relative left-right balance of stereo-linked channels or the MAIN stereo bus signal. Press the encoder to reset its value.&lt;br /&gt;
==VOLUME==&lt;br /&gt;
* 14. knob adjusts the mix level for selected mono and stereo-linked channels or the MAIN stereo bus signal. Press the encoder to mute.&lt;br /&gt;
==OUTPUT==&lt;br /&gt;
* 15. knob controls the overall master output level.&lt;br /&gt;
==GR LED==&lt;br /&gt;
* 16. lights to show when the output limiter is active.&lt;br /&gt;
==LIMITER==&lt;br /&gt;
* 17. knob controls the limiter threshold for the master output.&lt;br /&gt;
==CHANNEL SELECT==&lt;br /&gt;
* 18. buttons focus the desired mono and stereo-linked channels and groups for individual mix adjustment.&lt;br /&gt;
==DC IN==&lt;br /&gt;
* 19. connects to the included external power supply. Please use only BEHRINGER external power supplies.&lt;br /&gt;
==ON/OFF==&lt;br /&gt;
* 20. Duh switch.&lt;br /&gt;
==ULTRANET THRU==&lt;br /&gt;
* 21. sends an unprocessed copy of the ULTRANET IN to additional ULTRANET devices.&lt;br /&gt;
==ULTRANET IN==&lt;br /&gt;
* 22. receives 16 channels from ULTRANET devices over a shielded CAT5 digital audio cable.&lt;br /&gt;
==MIDI IN==&lt;br /&gt;
* 23. for control of all parameters using external MIDI controllers, as well as for firmware updates.&lt;br /&gt;
==LINE OUT==&lt;br /&gt;
* 24. transmits a copy of the MAIN stereo mix over two TRS cables. Alternatively, a single TRS cable can be connected to the L/MONO jack.&lt;br /&gt;
==PHONES==&lt;br /&gt;
* 25. output transmits a copy of the MAIN stereo mix over a 6.35 mm (1/4&amp;quot;) TRS connector.&lt;br /&gt;
&lt;br /&gt;
=P16-HQ Basic Setup=&lt;br /&gt;
# Turn the OUTPUT knob all the way down to the full&lt;br /&gt;
counterclockwise position.&lt;br /&gt;
# Turn the LIMITER knob all the way up to the full clockwise position.&lt;br /&gt;
# Confirm that the ULTRANET LED is lit.&lt;br /&gt;
# The parameters for each individual channel can be adjusted by pressing the corresponding CHANNEL SELECT button.  The LED in each CHANNEL SELECT button lights as follows:&lt;br /&gt;
#* Green (flickering): audio signal activity&lt;br /&gt;
#* Red (constant): mono channel or stereo-linked pair selected without audio signal activity&lt;br /&gt;
#* Yellow (flickering): mono channel or stereo-linked pair selected with audio signal activity&lt;br /&gt;
#* Red (blinking): the channel is part of the selected group, but the channel is currently not selected and there is no audio signal activity&lt;br /&gt;
#* Yellow (blinking): the channel is part of the selected group, but the channel is currently not selected and there is audio signal activity&lt;br /&gt;
# While playing audio, slowly turn the OUTPUT knob clockwise until you have a comfortable monitoring level.&lt;br /&gt;
# Slowly turn the LIMITER knob counterclockwise to get the limiter working and find an acceptable balance between dynamics and control of volume peaks.&lt;br /&gt;
# To adjust any individual or stereo channel in the mix, press the corresponding CHANNEL SELECT button. The channel’s LED will light red indicating the channel is selected for adjustment.&lt;br /&gt;
# Turn the VOLUME knob clockwise or counterclockwise to adjust the channel’s relative level in the mix.&lt;br /&gt;
# Turn the PANORAMA knob clockwise or counterclockwise to adjust the channel’s position in the stereo field.&lt;br /&gt;
# Adjust the channel’s low and high bands gain using the BASS and TREBLE knobs.&lt;br /&gt;
# Select the mid band center frequency for adjustment using the FREQ knob, and then adjust the mid band gain using the MID knob.&lt;br /&gt;
# Create stereo links by holding down the LINK button and then pressing the desired CHANNEL SELECT button. The related adjacent channel will become stereo-linked. Note that channels are always stereo-linked starting with an odd-numbered channel and assigning the odd-numbered channel to the left. All parameter values applied to the odd-numbered channel will be applied to both stereo-linked channels. &lt;br /&gt;
# To group several channels together, hold down the GROUP button, and then press the CHANNEL SELECT buttons of the channels you want to assign to the group. The LEDs for the selected channels will blink. Press the same CHANNEL SELECT button again to deselect the channel. Release the GROUP button to create the group with your selection of channels.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
After creating a group, it can be modified by holding down the GROUP button and pressing one of the CHANNEL SELECTION buttons assigned to the group. Now, channels can be added or removed from that group. &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
To create a  new group from the remaining unassigned channels, hold down the GROUP button and then press the CHANNEL SELECT button on a channel that is not currently assigned to a group (LED is off). Pressing an unassigned CHANNEL SELECT button opens a new group. Add more channels as desired.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
A channel can only be part of one group at the same time.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Adjusting the VOLUME of any channel within the group will modify the VOLUME of all the other grouped channels by the same amount. All other channel settings like EQ and PANORAMA remain independent.&lt;br /&gt;
# To mute one or multiple channels, hold down the MUTE button and then press the CHANNEL SELECT buttons on the desired channels.&lt;br /&gt;
# To solo the selected channel, press the SOLO button. Pressing another CHANNEL SELECTED button will solo the newly selected channel. To exit solo mode, press the SOLO button again.&lt;br /&gt;
# Save your settings to a preset by holding the STORE button and then select the target preset slot by pressing any one of the &lt;br /&gt;
# CHANNEL SELECT buttons.&lt;br /&gt;
# Load a preset by holding the RECALL button and pressing the CHANNEL SELECT button containing the desired preset.&lt;br /&gt;
&lt;br /&gt;
[[Category:Music]]&lt;br /&gt;
[[Category:VoYD]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1884</id>
		<title>VoYD</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD&amp;diff=1884"/>
		<updated>2025-07-08T09:24:37Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;=Gigs= * [https://docs.google.com/spreadsheets/d/e/2PACX-1vS3fepEaCnI1XjzccsC7SXo5Dno9X6jm9Ghy7ubFGn9BAleei9UiFG3L8lFoSh6xmEpiqH8OiIRLVIG/pubhtml?gid=2044986723&amp;amp;single=true Calendar Output]   Category:VoYD Category:Music&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gigs=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vS3fepEaCnI1XjzccsC7SXo5Dno9X6jm9Ghy7ubFGn9BAleei9UiFG3L8lFoSh6xmEpiqH8OiIRLVIG/pubhtml?gid=2044986723&amp;amp;single=true Calendar Output]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:VoYD]]&lt;br /&gt;
[[Category:Music]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1883</id>
		<title>Fallout 4 Running Multiple Copies</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1883"/>
		<updated>2024-08-10T15:06:42Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* INI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stub page for thoughts&lt;br /&gt;
&lt;br /&gt;
Fallout London requires 1.10.163.0&lt;br /&gt;
Vault 13 Demo requires 1.10.163.0&lt;br /&gt;
Fallout 4 Next Gen is &amp;gt; 1.10.163.0&lt;br /&gt;
&lt;br /&gt;
I wonder if &amp;quot;Mod Organizer 2&amp;quot; would do what I&#039;m trying to do (is it easier for me just figure out directory swapping?) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Read-Only=&lt;br /&gt;
For Steam users, to stop Fallout 4 from auto updating to the latest version:&lt;br /&gt;
* Find &amp;quot;appmanifest_377160.acf&amp;quot; and set it to Read-Only &lt;br /&gt;
** I have two copies of the .acf, one each with the flag set differently&lt;br /&gt;
&lt;br /&gt;
=Clean Base Installs=&lt;br /&gt;
Note: make sure you local saved games are safely backed up.  I&#039;m not sure I&#039;ll look too hard in how to manage saved games (maybe there is a mod for that).&lt;br /&gt;
==1.10.163.0==&lt;br /&gt;
* &#039;&#039;&#039;Goal:&#039;&#039;&#039; Create a clean installation folder named &amp;quot;Fallout 4 - 1.10.163.0&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Pre-Requisite:&#039;&#039;&#039; .....\Steam\steamapps\appmanifest_377160.acf is set to Read-Only &lt;br /&gt;
** See notes above&lt;br /&gt;
* &#039;&#039;&#039;Background:&#039;&#039;&#039; Since the Nextgen update there have been mods coming out that require the pre-Nextgen Fallout installation to work.  Creating a clean base install folder that can be used as the foundation for starting different mod installs seems like the way to go. G&lt;br /&gt;
&lt;br /&gt;
* See [https://forums.nexusmods.com/topic/13494967-downgrading-fallout-4-from-1109840-to-1101630-steam/ Downgrading Fallout 4 from 1.10.984.0 to 1.10.163.0 (Steam)] or the [[Talk:Fallout_4_Running_Multiple_Copies|Discussion Page]] here for archive reasons (and my notes)&lt;br /&gt;
** The Ultra-high resolution dlc is fairly large and should not be absolutely required (re: optional)&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==1.10.984.0==&lt;br /&gt;
* Make sure that the current Fallout 4 isn&#039;t really needed.  &lt;br /&gt;
* From the library manager, remove the installation.&lt;br /&gt;
* Start a fresh installation.  &lt;br /&gt;
* After install, before you run the game, copy the Fallout 4 folder&lt;br /&gt;
* Rename the copied folder &amp;quot;Fallout 4 - 1.10.984.0&amp;quot;&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==Clean Base Prep Completed==&lt;br /&gt;
You should now have a copy of each Fallout 4 base version, never run, at ...Steam\steamapps\common.  Next steps will make copies of these folders in relation to the specific mod.&lt;br /&gt;
&lt;br /&gt;
=Vault 13 Demo=&lt;br /&gt;
* Go to ...Steam\steamapps\common&lt;br /&gt;
* Shift+Right click in the folder and select Open Powershell Window Here or Open Command Window here&lt;br /&gt;
** If the latter, type powershell.exe and press enter in the command window&lt;br /&gt;
* Start the mod download and continue on while it downloads [https://www.nexusmods.com/fallout4/mods/85307?tab=files&amp;amp;file_id=329601 Fallout Vault 13 Demo]&lt;br /&gt;
* Run the following command and wait while it copies files&lt;br /&gt;
&amp;lt;pre&amp;gt;Copy-Item -Path &amp;quot;Fallout 4 - 1.10.163.0&amp;quot; -Destination &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; -Recurse&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Vault 13 Demo doesn&#039;t like cc (Creation Club) files.  Run the following command&lt;br /&gt;
&amp;lt;pre&amp;gt;Remove-Item -Path &amp;quot;Fallout 4 - Vault 13 Demo\Data\cc*&amp;quot; -Confirm&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Y for each individual file, A for All, L will skip them all.&lt;br /&gt;
* Grab a copy of f4se for 1.10.163.0 and install that in &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; per the mod installation directions of the mod.&lt;br /&gt;
*# [https://www.nexusmods.com/fallout4/mods/42147?tab=files get old file version 0.6.23]&lt;br /&gt;
*# [https://f4se.silverlock.org/ https://f4se.silverlock.org/] - Programmer&#039;s site versions&lt;br /&gt;
==INI==&lt;br /&gt;
# go to C:\Users\Username\Documents\My Games\Fallout4&lt;br /&gt;
## If you&#039;re already running a major mod like London, make a copy of the current fallout.ini file&lt;br /&gt;
#* name it something obvious &amp;quot;Fallout4 - Copy - London.ini&amp;quot;&lt;br /&gt;
## If not, make a copy ala &amp;quot;Fallout4 - Copy - Original.ini&amp;quot;&lt;br /&gt;
# Edit the fallout.ini file per the install instructions&lt;br /&gt;
#* I made a copy of the changed file ala &amp;quot;Fallout4 - Copy - Vault13.ini&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category:Gaming]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1882</id>
		<title>Fallout 4 Running Multiple Copies</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1882"/>
		<updated>2024-08-10T15:06:15Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* INI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stub page for thoughts&lt;br /&gt;
&lt;br /&gt;
Fallout London requires 1.10.163.0&lt;br /&gt;
Vault 13 Demo requires 1.10.163.0&lt;br /&gt;
Fallout 4 Next Gen is &amp;gt; 1.10.163.0&lt;br /&gt;
&lt;br /&gt;
I wonder if &amp;quot;Mod Organizer 2&amp;quot; would do what I&#039;m trying to do (is it easier for me just figure out directory swapping?) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Read-Only=&lt;br /&gt;
For Steam users, to stop Fallout 4 from auto updating to the latest version:&lt;br /&gt;
* Find &amp;quot;appmanifest_377160.acf&amp;quot; and set it to Read-Only &lt;br /&gt;
** I have two copies of the .acf, one each with the flag set differently&lt;br /&gt;
&lt;br /&gt;
=Clean Base Installs=&lt;br /&gt;
Note: make sure you local saved games are safely backed up.  I&#039;m not sure I&#039;ll look too hard in how to manage saved games (maybe there is a mod for that).&lt;br /&gt;
==1.10.163.0==&lt;br /&gt;
* &#039;&#039;&#039;Goal:&#039;&#039;&#039; Create a clean installation folder named &amp;quot;Fallout 4 - 1.10.163.0&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Pre-Requisite:&#039;&#039;&#039; .....\Steam\steamapps\appmanifest_377160.acf is set to Read-Only &lt;br /&gt;
** See notes above&lt;br /&gt;
* &#039;&#039;&#039;Background:&#039;&#039;&#039; Since the Nextgen update there have been mods coming out that require the pre-Nextgen Fallout installation to work.  Creating a clean base install folder that can be used as the foundation for starting different mod installs seems like the way to go. G&lt;br /&gt;
&lt;br /&gt;
* See [https://forums.nexusmods.com/topic/13494967-downgrading-fallout-4-from-1109840-to-1101630-steam/ Downgrading Fallout 4 from 1.10.984.0 to 1.10.163.0 (Steam)] or the [[Talk:Fallout_4_Running_Multiple_Copies|Discussion Page]] here for archive reasons (and my notes)&lt;br /&gt;
** The Ultra-high resolution dlc is fairly large and should not be absolutely required (re: optional)&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==1.10.984.0==&lt;br /&gt;
* Make sure that the current Fallout 4 isn&#039;t really needed.  &lt;br /&gt;
* From the library manager, remove the installation.&lt;br /&gt;
* Start a fresh installation.  &lt;br /&gt;
* After install, before you run the game, copy the Fallout 4 folder&lt;br /&gt;
* Rename the copied folder &amp;quot;Fallout 4 - 1.10.984.0&amp;quot;&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==Clean Base Prep Completed==&lt;br /&gt;
You should now have a copy of each Fallout 4 base version, never run, at ...Steam\steamapps\common.  Next steps will make copies of these folders in relation to the specific mod.&lt;br /&gt;
&lt;br /&gt;
=Vault 13 Demo=&lt;br /&gt;
* Go to ...Steam\steamapps\common&lt;br /&gt;
* Shift+Right click in the folder and select Open Powershell Window Here or Open Command Window here&lt;br /&gt;
** If the latter, type powershell.exe and press enter in the command window&lt;br /&gt;
* Start the mod download and continue on while it downloads [https://www.nexusmods.com/fallout4/mods/85307?tab=files&amp;amp;file_id=329601 Fallout Vault 13 Demo]&lt;br /&gt;
* Run the following command and wait while it copies files&lt;br /&gt;
&amp;lt;pre&amp;gt;Copy-Item -Path &amp;quot;Fallout 4 - 1.10.163.0&amp;quot; -Destination &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; -Recurse&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Vault 13 Demo doesn&#039;t like cc (Creation Club) files.  Run the following command&lt;br /&gt;
&amp;lt;pre&amp;gt;Remove-Item -Path &amp;quot;Fallout 4 - Vault 13 Demo\Data\cc*&amp;quot; -Confirm&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Y for each individual file, A for All, L will skip them all.&lt;br /&gt;
* Grab a copy of f4se for 1.10.163.0 and install that in &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; per the mod installation directions of the mod.&lt;br /&gt;
*# [https://www.nexusmods.com/fallout4/mods/42147?tab=files get old file version 0.6.23]&lt;br /&gt;
*# [https://f4se.silverlock.org/ https://f4se.silverlock.org/] - Programmer&#039;s site versions&lt;br /&gt;
==INI==&lt;br /&gt;
# go to C:\Users\Username\Documents\My Games\Fallout4&lt;br /&gt;
# If you&#039;re already running a major mod like London, make a copy of the current fallout.ini file&lt;br /&gt;
#* name it something obvious &amp;quot;Fallout4 - Copy - London.ini&amp;quot;&lt;br /&gt;
# If not, make a copy ala &amp;quot;Fallout4 - Copy - Original.ini&amp;quot;&lt;br /&gt;
# Edit the fallout.ini file per the install instructions&lt;br /&gt;
#* I made a copy of the changed file ala &amp;quot;Fallout4 - Copy - Vault13.ini&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category:Gaming]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1881</id>
		<title>Fallout 4 Running Multiple Copies</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1881"/>
		<updated>2024-08-10T15:05:43Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* INI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stub page for thoughts&lt;br /&gt;
&lt;br /&gt;
Fallout London requires 1.10.163.0&lt;br /&gt;
Vault 13 Demo requires 1.10.163.0&lt;br /&gt;
Fallout 4 Next Gen is &amp;gt; 1.10.163.0&lt;br /&gt;
&lt;br /&gt;
I wonder if &amp;quot;Mod Organizer 2&amp;quot; would do what I&#039;m trying to do (is it easier for me just figure out directory swapping?) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Read-Only=&lt;br /&gt;
For Steam users, to stop Fallout 4 from auto updating to the latest version:&lt;br /&gt;
* Find &amp;quot;appmanifest_377160.acf&amp;quot; and set it to Read-Only &lt;br /&gt;
** I have two copies of the .acf, one each with the flag set differently&lt;br /&gt;
&lt;br /&gt;
=Clean Base Installs=&lt;br /&gt;
Note: make sure you local saved games are safely backed up.  I&#039;m not sure I&#039;ll look too hard in how to manage saved games (maybe there is a mod for that).&lt;br /&gt;
==1.10.163.0==&lt;br /&gt;
* &#039;&#039;&#039;Goal:&#039;&#039;&#039; Create a clean installation folder named &amp;quot;Fallout 4 - 1.10.163.0&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Pre-Requisite:&#039;&#039;&#039; .....\Steam\steamapps\appmanifest_377160.acf is set to Read-Only &lt;br /&gt;
** See notes above&lt;br /&gt;
* &#039;&#039;&#039;Background:&#039;&#039;&#039; Since the Nextgen update there have been mods coming out that require the pre-Nextgen Fallout installation to work.  Creating a clean base install folder that can be used as the foundation for starting different mod installs seems like the way to go. G&lt;br /&gt;
&lt;br /&gt;
* See [https://forums.nexusmods.com/topic/13494967-downgrading-fallout-4-from-1109840-to-1101630-steam/ Downgrading Fallout 4 from 1.10.984.0 to 1.10.163.0 (Steam)] or the [[Talk:Fallout_4_Running_Multiple_Copies|Discussion Page]] here for archive reasons (and my notes)&lt;br /&gt;
** The Ultra-high resolution dlc is fairly large and should not be absolutely required (re: optional)&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==1.10.984.0==&lt;br /&gt;
* Make sure that the current Fallout 4 isn&#039;t really needed.  &lt;br /&gt;
* From the library manager, remove the installation.&lt;br /&gt;
* Start a fresh installation.  &lt;br /&gt;
* After install, before you run the game, copy the Fallout 4 folder&lt;br /&gt;
* Rename the copied folder &amp;quot;Fallout 4 - 1.10.984.0&amp;quot;&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==Clean Base Prep Completed==&lt;br /&gt;
You should now have a copy of each Fallout 4 base version, never run, at ...Steam\steamapps\common.  Next steps will make copies of these folders in relation to the specific mod.&lt;br /&gt;
&lt;br /&gt;
=Vault 13 Demo=&lt;br /&gt;
* Go to ...Steam\steamapps\common&lt;br /&gt;
* Shift+Right click in the folder and select Open Powershell Window Here or Open Command Window here&lt;br /&gt;
** If the latter, type powershell.exe and press enter in the command window&lt;br /&gt;
* Start the mod download and continue on while it downloads [https://www.nexusmods.com/fallout4/mods/85307?tab=files&amp;amp;file_id=329601 Fallout Vault 13 Demo]&lt;br /&gt;
* Run the following command and wait while it copies files&lt;br /&gt;
&amp;lt;pre&amp;gt;Copy-Item -Path &amp;quot;Fallout 4 - 1.10.163.0&amp;quot; -Destination &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; -Recurse&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Vault 13 Demo doesn&#039;t like cc (Creation Club) files.  Run the following command&lt;br /&gt;
&amp;lt;pre&amp;gt;Remove-Item -Path &amp;quot;Fallout 4 - Vault 13 Demo\Data\cc*&amp;quot; -Confirm&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Y for each individual file, A for All, L will skip them all.&lt;br /&gt;
* Grab a copy of f4se for 1.10.163.0 and install that in &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; per the mod installation directions of the mod.&lt;br /&gt;
*# [https://www.nexusmods.com/fallout4/mods/42147?tab=files get old file version 0.6.23]&lt;br /&gt;
*# [https://f4se.silverlock.org/ https://f4se.silverlock.org/] - Programmer&#039;s site versions&lt;br /&gt;
==INI==&lt;br /&gt;
* go to C:\Users\Username\Documents\My Games\Fallout4&lt;br /&gt;
** If you&#039;re already running a major mod like London, make a copy of the current fallout.ini file&lt;br /&gt;
*** name it something obvious &amp;quot;Fallout4 - Copy - London.ini&amp;quot;&lt;br /&gt;
** If not, make a copy ala &amp;quot;Fallout4 - Copy - Original.ini&amp;quot;&lt;br /&gt;
** Edit the fallout.ini file per the install instructions&lt;br /&gt;
*** I made a copy of the changed file ala &amp;quot;Fallout4 - Copy - Vault13.ini&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category:Gaming]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1880</id>
		<title>Fallout 4 Running Multiple Copies</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1880"/>
		<updated>2024-08-10T15:04:59Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Vault 13 Demo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stub page for thoughts&lt;br /&gt;
&lt;br /&gt;
Fallout London requires 1.10.163.0&lt;br /&gt;
Vault 13 Demo requires 1.10.163.0&lt;br /&gt;
Fallout 4 Next Gen is &amp;gt; 1.10.163.0&lt;br /&gt;
&lt;br /&gt;
I wonder if &amp;quot;Mod Organizer 2&amp;quot; would do what I&#039;m trying to do (is it easier for me just figure out directory swapping?) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Read-Only=&lt;br /&gt;
For Steam users, to stop Fallout 4 from auto updating to the latest version:&lt;br /&gt;
* Find &amp;quot;appmanifest_377160.acf&amp;quot; and set it to Read-Only &lt;br /&gt;
** I have two copies of the .acf, one each with the flag set differently&lt;br /&gt;
&lt;br /&gt;
=Clean Base Installs=&lt;br /&gt;
Note: make sure you local saved games are safely backed up.  I&#039;m not sure I&#039;ll look too hard in how to manage saved games (maybe there is a mod for that).&lt;br /&gt;
==1.10.163.0==&lt;br /&gt;
* &#039;&#039;&#039;Goal:&#039;&#039;&#039; Create a clean installation folder named &amp;quot;Fallout 4 - 1.10.163.0&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Pre-Requisite:&#039;&#039;&#039; .....\Steam\steamapps\appmanifest_377160.acf is set to Read-Only &lt;br /&gt;
** See notes above&lt;br /&gt;
* &#039;&#039;&#039;Background:&#039;&#039;&#039; Since the Nextgen update there have been mods coming out that require the pre-Nextgen Fallout installation to work.  Creating a clean base install folder that can be used as the foundation for starting different mod installs seems like the way to go. G&lt;br /&gt;
&lt;br /&gt;
* See [https://forums.nexusmods.com/topic/13494967-downgrading-fallout-4-from-1109840-to-1101630-steam/ Downgrading Fallout 4 from 1.10.984.0 to 1.10.163.0 (Steam)] or the [[Talk:Fallout_4_Running_Multiple_Copies|Discussion Page]] here for archive reasons (and my notes)&lt;br /&gt;
** The Ultra-high resolution dlc is fairly large and should not be absolutely required (re: optional)&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==1.10.984.0==&lt;br /&gt;
* Make sure that the current Fallout 4 isn&#039;t really needed.  &lt;br /&gt;
* From the library manager, remove the installation.&lt;br /&gt;
* Start a fresh installation.  &lt;br /&gt;
* After install, before you run the game, copy the Fallout 4 folder&lt;br /&gt;
* Rename the copied folder &amp;quot;Fallout 4 - 1.10.984.0&amp;quot;&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==Clean Base Prep Completed==&lt;br /&gt;
You should now have a copy of each Fallout 4 base version, never run, at ...Steam\steamapps\common.  Next steps will make copies of these folders in relation to the specific mod.&lt;br /&gt;
&lt;br /&gt;
=Vault 13 Demo=&lt;br /&gt;
* Go to ...Steam\steamapps\common&lt;br /&gt;
* Shift+Right click in the folder and select Open Powershell Window Here or Open Command Window here&lt;br /&gt;
** If the latter, type powershell.exe and press enter in the command window&lt;br /&gt;
* Start the mod download and continue on while it downloads [https://www.nexusmods.com/fallout4/mods/85307?tab=files&amp;amp;file_id=329601 Fallout Vault 13 Demo]&lt;br /&gt;
* Run the following command and wait while it copies files&lt;br /&gt;
&amp;lt;pre&amp;gt;Copy-Item -Path &amp;quot;Fallout 4 - 1.10.163.0&amp;quot; -Destination &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; -Recurse&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Vault 13 Demo doesn&#039;t like cc (Creation Club) files.  Run the following command&lt;br /&gt;
&amp;lt;pre&amp;gt;Remove-Item -Path &amp;quot;Fallout 4 - Vault 13 Demo\Data\cc*&amp;quot; -Confirm&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Y for each individual file, A for All, L will skip them all.&lt;br /&gt;
* Grab a copy of f4se for 1.10.163.0 and install that in &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; per the mod installation directions of the mod.&lt;br /&gt;
*# [https://www.nexusmods.com/fallout4/mods/42147?tab=files get old file version 0.6.23]&lt;br /&gt;
*# [https://f4se.silverlock.org/ https://f4se.silverlock.org/] - Programmer&#039;s site versions&lt;br /&gt;
==INI==&lt;br /&gt;
* go to C:\Users\Username\Documents\My Games\Fallout4&lt;br /&gt;
** If you&#039;re already running a major mod like London, make a copy of the current fallout.ini file&lt;br /&gt;
*** name it something obvious &amp;quot;Fallout4 - Copy - London.ini&amp;quot;&lt;br /&gt;
** Edit the fallout.ini file per the install instructions&lt;br /&gt;
*** I made a copy of the changed file ala &amp;quot;Fallout4 - Copy - Vault13.ini&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category:Gaming]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1879</id>
		<title>Fallout 4 Running Multiple Copies</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Fallout_4_Running_Multiple_Copies&amp;diff=1879"/>
		<updated>2024-08-10T14:49:53Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Vault 13 Demo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stub page for thoughts&lt;br /&gt;
&lt;br /&gt;
Fallout London requires 1.10.163.0&lt;br /&gt;
Vault 13 Demo requires 1.10.163.0&lt;br /&gt;
Fallout 4 Next Gen is &amp;gt; 1.10.163.0&lt;br /&gt;
&lt;br /&gt;
I wonder if &amp;quot;Mod Organizer 2&amp;quot; would do what I&#039;m trying to do (is it easier for me just figure out directory swapping?) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Read-Only=&lt;br /&gt;
For Steam users, to stop Fallout 4 from auto updating to the latest version:&lt;br /&gt;
* Find &amp;quot;appmanifest_377160.acf&amp;quot; and set it to Read-Only &lt;br /&gt;
** I have two copies of the .acf, one each with the flag set differently&lt;br /&gt;
&lt;br /&gt;
=Clean Base Installs=&lt;br /&gt;
Note: make sure you local saved games are safely backed up.  I&#039;m not sure I&#039;ll look too hard in how to manage saved games (maybe there is a mod for that).&lt;br /&gt;
==1.10.163.0==&lt;br /&gt;
* &#039;&#039;&#039;Goal:&#039;&#039;&#039; Create a clean installation folder named &amp;quot;Fallout 4 - 1.10.163.0&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Pre-Requisite:&#039;&#039;&#039; .....\Steam\steamapps\appmanifest_377160.acf is set to Read-Only &lt;br /&gt;
** See notes above&lt;br /&gt;
* &#039;&#039;&#039;Background:&#039;&#039;&#039; Since the Nextgen update there have been mods coming out that require the pre-Nextgen Fallout installation to work.  Creating a clean base install folder that can be used as the foundation for starting different mod installs seems like the way to go. G&lt;br /&gt;
&lt;br /&gt;
* See [https://forums.nexusmods.com/topic/13494967-downgrading-fallout-4-from-1109840-to-1101630-steam/ Downgrading Fallout 4 from 1.10.984.0 to 1.10.163.0 (Steam)] or the [[Talk:Fallout_4_Running_Multiple_Copies|Discussion Page]] here for archive reasons (and my notes)&lt;br /&gt;
** The Ultra-high resolution dlc is fairly large and should not be absolutely required (re: optional)&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==1.10.984.0==&lt;br /&gt;
* Make sure that the current Fallout 4 isn&#039;t really needed.  &lt;br /&gt;
* From the library manager, remove the installation.&lt;br /&gt;
* Start a fresh installation.  &lt;br /&gt;
* After install, before you run the game, copy the Fallout 4 folder&lt;br /&gt;
* Rename the copied folder &amp;quot;Fallout 4 - 1.10.984.0&amp;quot;&lt;br /&gt;
* Place the new folder at ...Steam\steamapps\common&lt;br /&gt;
&lt;br /&gt;
==Clean Base Prep Completed==&lt;br /&gt;
You should now have a copy of each Fallout 4 base version, never run, at ...Steam\steamapps\common.  Next steps will make copies of these folders in relation to the specific mod.&lt;br /&gt;
&lt;br /&gt;
=Vault 13 Demo=&lt;br /&gt;
* Go to ...Steam\steamapps\common&lt;br /&gt;
* Shift+Right click in the folder and select Open Powershell Window Here or Open Command Window here&lt;br /&gt;
** If the latter, type powershell.exe and press enter in the command window&lt;br /&gt;
* Start the mod download and continue on while it downloads [https://www.nexusmods.com/fallout4/mods/85307?tab=files&amp;amp;file_id=329601 Fallout Vault 13 Demo]&lt;br /&gt;
* Run the following command and wait while it copies files&lt;br /&gt;
&amp;lt;pre&amp;gt;Copy-Item -Path &amp;quot;Fallout 4 - 1.10.163.0&amp;quot; -Destination &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; -Recurse&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Vault 13 Demo doesn&#039;t like cc (Creation Club) files.  Run the following command&lt;br /&gt;
&amp;lt;pre&amp;gt;Remove-Item -Path &amp;quot;Fallout 4 - Vault 13 Demo\Data\cc*&amp;quot; -Confirm&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Y for each individual file, A for All, L will skip them all.&lt;br /&gt;
* Grab a copy of f4se for 1.10.163.0 and install that in &amp;quot;Fallout 4 - Vault 13 Demo&amp;quot; per the mod installation directions of the mod.&lt;br /&gt;
*# [https://www.nexusmods.com/fallout4/mods/42147?tab=files get old file version 0.6.23]&lt;br /&gt;
*# [https://f4se.silverlock.org/ https://f4se.silverlock.org/] - Programmer&#039;s site versions&lt;br /&gt;
&lt;br /&gt;
[[Category:Gaming]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
</feed>