Making GIMP 2.8 useful

Good news! You can add a plugin to GIMP 2.8 that enables it to save files normally!

The issue

Months ago, the developers of the Graphic Image Manipulation Program (a.k.a. “The GIMP”) released version 2.8. Many regular users were dismayed to discover that we could no longer do the following:

  1. open a .jpg file;
  2. edit it;
  3. save it using CTRL+S;
  4. and close it. [Without a warning, since I have just saved my work]

Once I started searching the discussion boards, I discovered that several thousand users have already complained about the change from version 2.6 to version 2.8. The response of the GIMP developers has been defensive and condescending, which is unfortunate. They do have very good reasons for pushing users to adopt the .XCF file format, which is the native GIMP format. XCF saves layers and layer states; it retains editable text and paths; and it is not lossy. For each of these reasons, I do keep “working files” in XCF format. I have about 200 images that I occasionally re-work.

But I have about 22,000 images that I need to sort and organize from my field research on cities. I can organize those photos in their original JPEG format using any file manager on Linux, Mac OS, Windows, or Android, using their thumbnail-previews. So far as I know, no file-manager can view thumbnails of XCF files by default. I think there may be plug-ins for some of the file-managers that I use; but I would have to custom-modify each file-manager to keep my XCF files organized. So I have no plans to convert my collection of photos to XCF. And unless I need to keep a multi-layered, lossless working copy, I don’t have time nor need for XCF.

The GIMP developers have dismissed us protesters as low-end users who should switch to another program. That is insulting to everyone who has written a script that works in GIMP. This “low-end user” does not know of another open-source program in which I can set up a batch process to adjust the gamma of one color-layer, and then crop and resize to 1024×768 so I can show slides to my students. Furthermore, the GIMP developers point to their vision statement and–lo and behold!–it says that they want GIMP to be user-configurable! But they have steadfastly refused to put in configuration options so that end-users can re-set the Save/Save As functions to behave as they did in GIMP 2.6.

Note that the behavior of GIMP version 2.6 followed the standard procedure in GUI computing: when I open a file and change it, I will overwrite the original if I type CTRL+S and then CTRL+W. Since 1988 I have always needed to be careful about overwriting versions of files that I might want to save. So I do recommend using Save As and a filename protocol to track changes. I need to do that with text files, spreadsheets, GIS shapefiles, JPEGs, and–yes–even XCF files if I want to keep more than one draft. What I don’t need is to have one group of developers cripple their software to force me to manage my file-changes in THEIR method.


Akkana Peck knows Python! And I do not. She has written two Python scripts which resolve the “Save/Save As” problem in GIMP 2.8! This is the link to her November 2013 version. To install:

  1. When you open the GitHub page linked above, click on the “Raw” button and you will get the raw text of the python script.
  2. Select all, copy, and paste the text into a text editor. Use an editor that does not add hidden formatting. I use Gedit in Ubuntu, or Notepad in Windows.
  3. Save the file with this name:
  4. In Ubuntu, make sure the file is set to executable. Open a terminal, change to the directory where you have placed the file, and enter:
    $ sudo chmod +x
  5. Then copy it to your GIMP plugins directory:
    $ sudo cp ~/.gimp-2.8/plug-ins/
  6. Then (re)start GIMP.

If python is installed and running, and the plugin is installed correctly, it will add two items to your File drop-down menu, below Save and Save As: “Saver as…” and “Saver.” You can invoke these new functions manually, but you can also map the shortcut keys to them:

  1. Go to Edit > Keyboard Shortcuts… this opens the ‘Configure Keyboard Shortcuts’ dialog.
  2. Open the Plugins dropdown and scroll way down for Saver and Saver As. On my system, it is the last two Python scripts before the list shifts to Script-Fu scripts.
  3. Click “Saver” and the Shortcut field will activate. Press the CTRL+S keys, and they are assigned.
  4. Click “Saver As,” and the Shortcut field for this script will activate. Press CTRL+SHIFT+S, and these keys will be assigned.

GIMP will now behave like all the other applications on your system!

In closing…

I sincerely hope that the GIMP developers re-embrace the spirit of the open-source community: sharing work, building on each other’s efforts, listening to users and responding to us, and promoting maximum configurability within the software by default. If not, I expect that a fork of the GIMP led by compassionate people will eclipse the current developer-team.

Got justice?

Tomorrow evening, Friday, November 22, there will be a candlelight vigil at 5:00 pm, 15th and Guerrero Streets in San Francisco, to protest the beating of D’Paris Williams one week earlier by plainclothes police officers of the San Francisco Police Department. D’Paris lives in Valencia Gardens, one of only a few public housing complexes in our absurdly-expensive City. It seems that he was beaten in front of his own house as he was returning home from the “Batkid” festivities.

All the evidence I can find indicates that D’Paris committed no crime before he was beaten. Witnesses of the incident immediately objected to his treatment, and three more were beaten and arrested. Now: the Chief of Police, Greg Suhr, says “the public’s trust is everything to us.” That is correct: enforcement of law and order is only feasible when the population trusts and respects the police to serve the public, abide by their oath, and act as Peace Officers. If they violate that oath by beating a man who has committed no crime, then exactly the same law should apply to them: prosecution for felony assault. If the SFPD fires these officers and prosecutes them, then some trust in the SFPD will be restored.

At the end of two of the articles I have linked to, anonymous posters have made grossly prejudiced comments about D’Paris. I am dismayed, but the cowardly honesty of such comments reveals the degree of racism that persists here in San Francisco. This bigotry is also tied directly to gentrification: only two blocks south of the site of this beating, Valencia Street is undergoing some of the most dramatic gentrification in the United States. A criminal record imposed on a young black man would be grounds for his eviction from Valencia Gardens, and from the City as a whole. It would be one more step towards making San Francisco a symbol of injustice, intolerance, and racial segregation. Is this what we want San Francisco to represent?

I am a public servant of the State of California. I teach the principles of justice to hundreds of students every year. I hope you will join me in praying for D’Paris Williams, Orlando Rodriguez, Antoine Bradford, and every other young man who had been unjustly beaten and then accused of assault by the very same officers who beat him. I hope to see you tomorrow night.

8,914 Miles

Last night we returned to Berkeley from our round-the-country road trip. We logged 8,914.3 miles on the trip odometer.

It is Sunday morning, August 25. After I post this I will put together the readings and class websites for two of the four (yikes!) courses that I will be teaching this fall at San Francisco State. This marks a major change of mode back to being an academic. Bearing-grease is still wedged in the callus-cracks on my hands; but within a few weeks the calluses will peel away from everywhere except my keyboard-tapping fingertips. Four months of intense manual labor are ended. The inflammation of my carpal tunnels has already begun to abate; I am no longer awoken at 5 AM by radiating pain along my fingers and arms. I love building, designing, and problem-solving; but I do not have the manual toughness required to make a living as a builder.

A conversation across America

At one level, I still feel like it was a foolish use of time to build the trailer rather than rent a camper. I have three journal articles I really want to finish and submit for publication. Quite obviously, that is what I need to do to advance my career. But there are two ways in which the trailer was time well spent. First of all, it feeds my design-craving. I love to prototype; and the trailer design that we needed did not exist. Felipe (named for Felipe Paris, R.I.P.) enabled the four of us to camp in all sorts of places, through four major storms. And it was light enough to be pulled by Glove–our 2.0 liter, 4-cylinder VW Golf. Felipe the Camper is 400 pounds, 9 feet long, 4 feet wide, and 4 feet high at its crown. It is a shockingly small and light camper for four people. Time permitting (hah!) I will go over the lessons we learned on the road about the design.

The second, and far more important benefit of the trailer was that it provoked conversations with the full spectrum of Americans we encountered from California to South Dakota to New Hampshire to Virginia to Louisiana, Texas, and New Mexico. In a 15-second interchange with the toll-booth attendant at the Grand Isle Bridge near Niagara Falls, she told me about a magazine retrospective on teardrop trailers. In western Virginia, to fellows in a pickup asked for a look inside to understand the design. I know the stereotype–I think they were even wearing flannel–but from their polite sophistication I came up with a new term: HillWilliams, in contrast to the pejorative HillBilly. In Euclid, Ohio, a brief discussion of the trailer with a biker led into an extended discussion about racial politics, social policy, and the declining economy and population of metropolitan Cleveland. John is an African-American, social conservative, with a strong distaste for the way that public housing policy shaped his peers while growing up in Euclid.

So many conversations, so many stories. John Steinbeck got comments on his trailer when he traveled with his dog Charlie; but the amount of attention we got with Felipe was really extraordinary. The way it gave us friendly access to sooo many people was precious beyond any monetary cost; it even justified the twelve-week time cost to build it. Now, on to my class preparations.

Guppy Trailer, Part 6: towards completion


When we returned from our 1K test, I wanted to finish out the trailer as quickly as possible so that I could do some research and writing (That has not happened yet). I immediately set to building the galley-hatch. I continue to learn how to apply greater pressure for field-bending sheets of plywood. Here I am bending a 4′ wide sheet of 1/4″ birch veneer as the back face of the hatch.


Next, I inserted insulation, just as in the roof and sidewalls.


Here is a detail-shot of the hatch where it meets the roof and sidewall. In my effort at waterproofing, I have glued a slit-open bicycle inntertube to the piano-hinge. The end-detail is messy and inelegant; hopefully it will work.


To lock the lid closed, our neighbor Keith gave me a garage-door type closer, with horizontal sliding bars. Here I am fashioning the jamb-socket for the closer.


Here you begin to see the distinctive Guppy shape of this design.


I also began fitting trim for the door and the windows.  130720_1102_LRearView

The last exterior addition was the rear “haunches,” situated over each wheel well. These side-lockers open out to provide work-surfaces for me and the children.


Here you can see the left haunch taking shape. Also note how the curve of the galley-hatch lid matches the curve of the roof; both are 10′-radius arcs, and the inflection-point is right at the hatch-hinge (see the design drawings in earlier posts). I like to say, sarcastically. ‘Oh yeah! I meant to do that!’ But sometimes, design-features are just fortuitous.

Also note that when properly varnished, the birch ply is utterly gorgeous. See how the sun refracts against the wood grain?130725_LRearWithHaunch_4797Here, the left haunch is nearing completion. Sadly, I got a bad piece of birch ply from Ashby Lumber. Delamination was so extensive that I stripped off the entire birch veneer and exposed the knotty-pine interlayer. It does not look pretty.


With both haunches installed, the Guppy has taken on its final shape.

Guppy trailer, part 5: 1000-mile test



On July 4, we drove to Ashland, OR and saw Misner & Smith in concert. It was 107 degrees in the Sacramento Valley during our drive, so we had the air conditioner on most of the way. We found that the AC slowed us down far more than the trailer. Aside from an occasional chunka-chunk shaking of the trailer-hitch, the trailer’s effect on the car was barely noticeable. A good sign! In the image above you can see now the Guppy is relatively large compared to our golf, but tiny compared to a standard American camper.


Ashland is quite beautiful; I recommend it. Dragonflies.130705_0642_TrailerAtApt

Our first night on the road, we camped behind an apartment building. Not so romantic, but realistic: the Guppy is designed so that we can camp wherever we park. Here you can see the unfinished back end; we won’t know the aerodynamics of the full trailer until the hatch-lid and haunches are built.  130707_1008_kids+trailer

On our second night we stayed at Tule Lake, after visiting the Japanese-American internment camp site. Apparently the TuleLake camp was famous for housing dissidents and (Japanese)Americans who would not sign an insulting “loyalty oath.”

On our third night, we stayed in a park in Trinidad, CA.


Trinidad is stunningly beautiful. In many ways it is the beginning of the Pacific Northwest coast. It also has a fleet of tiny, working fishing boats. I thought it would be great to meet some of the boatwrights to confer about the Guppy trailer, since it is built like a wooden boat.



…But first, we had breakfast at Trinidad’s Beachcomber Cafe. Fabulous place.



They have displays of where their ingredients come from.


Trinidad is very different from Arcata, the hippie college town just down the road. Still groovy-north-coastal, but much more low key.

Teardrop Trailer 001

After breakfast, we went outside and lo and behold: a boat guy had found us. Actually, when we parked in town to go to the cafe, we parked in front of Ken Bechdol’s house. He has built many wooden boats, but the partially-complete trailer intrigued him. Ken emailed me the photo above; note that he laid a yardstick in the image for scale. Also note how incomplete the Guppy is: we used cling-film to close the window-holes. You can see straight through the gap between the door and the jamb. There is even a bit of a shark-fin where I have not trimmed down the side-paneling above the door.130707_1130_Ken

Ken showed me six of his boats. [Hopefully when he reads this, he will remind me of the names of the four wooden boats. A leeboard skiff? A gig? Argh, I did not write them down immediately. But the two coracles are so distinct they are hard to forget!]

Here, Ken is showing me that on the rail of the boat he left the edge of the plywood exposed, so that he could show the thinness, and humbleness of the actual hull material. When the wood is finished this nicely, though, that sandwiched plywood edge looks like decorative inlay.130707_1133_BechdolBoat

One of Ken’s strip-plank boats, suspended from the rafters of the shop/garage. 130707_1625_beadingArcata

After conferring with Ken for one highly-informative hour, we headed down to Arcata and made beaded jewelry. Lizzie came up with a brilliant design for a pair of earrings! When I get the chance I will post images of them.130707_1932_PegHouse_KeylockScarfJoint

On our way back from Arcata, we stopped at the Peg House for coffee and snacks. The cashier pointed out the elaborate carpentry shown above. He did not know the name of the joint; I believe it is called a key-lock lapped scarf joint. And yes, that is a portrait of The Man In Black, affixed to the underside of the joined beam.

The drive back was uneventful; the Guppy continued to handle smoothly. In Petaluma, our trip-meter marked 1,000 miles traveled.

Guppy trailer, part 4: assembled

At last, after a month of fabrication, I was able to assemble the parts on the morning of June 23, 2013. Strangely, it began to rain that day and drizzled off and on for the next two days–something I have never seen in California in June! But I had varnished so many of the components that it did not matter, and I was thankful for the cool weather. Sophia took the photographs, and Gabriel helped with the assembly:





Above, I am bolting down the left-side wall to the deck. The deck is a simple 4X8 sheet of 1/2″ plywood. I didn’t use the flatbed of the trailer itself as the deck because it is a mix of steel at the edges and rough pine planks across the middle–in fact the manufacturer would not give me shop drawings of it, and I had to design the cabin while I was waiting for the flatbed to be built and delivered to the dealer. So while I was assembling the walls and ribcage, I had the 1/2″ cabin-deck sitting on wooden crates. You can see one of the crates in this image, marked “computer.” By holding the deck up, I was able to install bolts from below into the L-brackets at the base of each wall-stud.


I attached the rear bulkhead and the left wall to the deck; then I could attach the ribcage. Here you see the “Pony” 90-degree vises in action. A few other things to note in this image: 1) Two weeks earlier I had scabbed the curved pieces together into five ‘flying’ ribs as well as top-rails attached to the sidewalls. To make sure they matched, I clamped them all together and belt-sanded them to a smooth match. Before unclamping the ribs, I marked across them every 4″. This greatly simplified the process of assembling the ribcage (see Part 3). You can see a few of the marks in the foreground. 2) You can also see the roughness of the rib-assembly. To use wood efficiently, the nose-curve had to be compiled out of short arcs of wood, glued together. On the left side of the picture you can see where the upper “back” segment overlaps with the upper “nose” segment and the lower “nose” segment of each rib. 3) Just beyond the ribcage is our neighbor’s car. Yes, I did indeed build this trailer in a parking-space.


With the ribcage and one side-wall installed, I then glued and screwed the first layer of 1/8″ plywood on the inside of the ribcage. This image clearly shows how the cabin-structure is ‘up on blocks’ for the moment, while I counter-sink and tighten the bolts that hold the ribs and wall studs to the deck. I have also cut and framed in the left side window openings, and the upper vent-openings. I could not wait any longer, because the next step was to install the rigid foam insulation into the wall-voids.


This view from the right-front shows how the structure is coming together. I installed the ceiling/nose layers of plywood before bolting on the right sidewall. That sequence was driven by the need to get big sheets inside before the openings were too small to admit them.

This turned out to be a problem because the stressed-skin ribcage flexed open a bit, and it was very difficult to get the right-side wall to align as I installed it. In retrospect, I would prefer to bend the interior sheets of plywood to the ribcage *after* both walls are installed. But how? The trapdoor in the rear bulkhead (see the image above) points toward a different solution. Rather than a partial-width trapdoor, you could make a full-width door–meaning that the bulkhead would not come down to the deck. Then you could slip full-length sheets of plywood into the interior space from the back, and bend them into place on a completed wall-and-rib frame.


I got the right-side wall installed. Then Lizzie helped me roll out sheets of thin foam underlayment before removing the wood blocks and dropping the cabin onto the flatbed. The thin foam underlayment comes from IKEA; it is what you lay down on a floor before installing their masonite faux hardwood floors. We had a roll of the foam left over after we installed such a floor in our living room.

Here you can also see the insulation I am cutting and jamming into the wall-cavities. Again, unexpectedly cool look! Crinkly yet shiny, like a 1960s space-capsule. I cut the foam with a kitchen knife. A word of advice: if you can’t stand the sound of squeaking styrofoam, this is a difficult step. Lizzie and the kids literally had to stay out of earshot during this entire process.


Next step: laminating the outer skin onto the ribcage. My neighbor Keith loaned me a set of cargo-straps, which I used to apply even pressure across the ply skin as I glued/screwed it down to the ribs. Other people, with more time, more clamps, and a garage, might be able to do this without screws. But one of the defining features of this project was that I had to get it built as quickly as possible.


View with the left side skin installed. Since I was using stainless-steel screws, I decided to just glue-screw the sidewalls and leave the screw heads exposed. The white vinyl tape on the flatbed marks the position of each wall-stud so I could align my screws.


I began the major assembly on June 23. By July 3, I had the structure insulated, had the outer skin installed, had it bolted to the flatbed using long, squared-off U-bolts. No windows, and the back end remained completely unfinished. The last thing I did before we towed the Guppy for 1,000 miles was install the door.

Guppy Trailer, Part 3: fabricating the components

I have been cranking away on the trailer as fast as I can, so I am inserting this blog post after-the fact. This page describes the fabrication of the components.


Here is the left sidewall, under construction in our living-room. A few things visible in this image:
1) On my dad’s advice I sanded the first layer of varnish with 400# sandpaper, cleaned off the dust, and applied a second coat. My goodness! what a glassy sheen!
2) The unvarnished white stripe in the foreground is where the rear bulkhead will be attached. I left it bare for better glue-adhesion.
3) Wall studs have been glued and screwed to the outside of the wall-panel. Two un-trimmed studs are visible at right, and a regular grid of screws across the face of the wall panel are faintly visible.
4) The inside-rib along the top of the wall-panel will be a guide-rail for the thin ply that I will bend in to make the ceiling.


Here is the same left-side wall panel, with the varnished inside face laid down on the new flatbed trailer. Rick Storrs made a great suggestion for windows which saved me time: rather than figure out operable windows, I would build simple, fixed windows and install vents to provide for ventilation. I placed five vents in the left wall: three low, and two high. I needed a rigid, cylindrical spacer to run the vent through the wall-insulation. What you see in the picture above is 3″ internal-diameter pipe, cut into 1.5″ segments, to provide a rigid passage between the outer and inner layers of the wall.


Here I am correcting a major mistake. I thought I had bought 1/2″ ply, in which case 3 layers would add up to 1.5″, the same thickness as the wall-stud depth and insulation thickness. However it was 3/8″ ply, so 3 layers added up to 1.15″ (with glue), not 1.5.” To make it work, I had to peel back the topmost layer of ply lamination, then add one more 3/8″ to flush it up to 1.5″.


And here is my biggest mistake: I used aluminium L-brackets at the base of the wall, to be fastened with stainless-steel screws. When exposed to moisture, the electrolytic reaction between these two metals would disintegrate the aluminium.

My solution was to coat the bolt-ends with Lexel, which is like silicone sealer but even stickier. My hope is that by entombing the connection, I will minimize the chances that water will be able to trigger the electrolytic reaction.


After many days of cutting, laminating, and grinding the ribs until I had full-length composites that matched, I began joining them together using cross-blocking. The easiest way to attach the blocking was to hold it against the rib using a “Pony” 90-degree vise. A dab of glue, a pre-drill and an end-screw, and the connection was done and strong. End-screw construction meant that the blocking could not line up across the rib-cage, but I did not worry about this because the ribcage would be covered, inside and out, with layers of thin bent plywood.


What I had not anticipated was that the overall pattern would be so beautiful! I’m glad I photographed it; I’m sorry now that it will disappear under a smooth layer of plywood.


Now, the key components are fabricated. Foreground: you can see the L-brackets, epoxied onto the blocking of the rib-cage. Background: on the far left is an old futon frame [not part of this project]; the plain rectangle of plywood next to that is the rear bulkhead; on the right are the two side-walls. I still haven’t cut the window-holes in that lovely glossy surface, but time-pressures will compel me to do that soon enough.


Love and Justice

[Written on the day that the Supreme Court overturned DOMA and dismissed the Prop 8 appeal, enabling the expansion of marriage-rights in California.]

Today I can wear my wedding-ring with pride.
Today our wedding-vows are affirmed.

Today, Love triumphed. The black-robed ministers of justice acknowledged the higher power of Love and the recognition of commitment, pushing aside all other reservations.

Justice reveals herself to us. Her radiance is Love; not prejudice, not fear of something different. Though Love may be constant, Love also provokes inevitable change; it opens our souls to face the unexpected.

Today I can say to my children that marriage is about that commitment to Love. No exceptions. Today, the shadow of cruel discrimination begins to lift. Justice smiles upon marriage, blind to the gender of those who commit so completely to each other.

When we stand together as a community to bear witness to a new marriage, we are often called to renew our own wedding vows. For men and women who have long enjoyed the right of marriage, today stands as a tremendous affirmation–a strengthening–a renewal of our own commitment to marriage.

Today I wear my wedding-ring with PRIDE.

Guppy Trailer, part 2: cutting the ribs

The next task was to design the Guppy cabin itself. A rib-and-skin scheme, infilled with rigid insulation and overlaid with thin sheet aluminum (0.24 ga, if I can manage it) seems like the lightest overall design. I started with 1/2″ marine ply sheets, to be cut into 1.5″ wide curved ribs. Below is my first cut-sheet pattern:


What I have tried to do is use as much of the sheet as possible. I then scaled up the original drawing to 1:1 scale;
printed it on multiple sheets of paper;
pieced them together on a sliding-glass door and taped them together;
laid the paper-mosaic onto the plywood sheet;
slipped carbon transfer paper under the mosaic; and
traced the design onto the plywood using a ballpoint pen.


The second cut-sheet leaves a lot of unused material between the irregular “chevron” shapes of the galley-hatch ribs. That wood will be cut up into blocking to go between the ribs.

Here are the two cut-sheets used for the structural ribs, at 1:1 scale:


Guppy Trailer, part 1: the basic concept

This summer Lizzie wants to go on a grand-loop road-trip around the U.S. with the kids. We have thought about various ways to do this, and we have decided upon building a teardrop-type trailer which we will tow behind our VW Golf (a.k.a. Glove). Why? 1. We need something convenient to camp in. At first I was not sure that I was going to go on the trip (I tried to get back to Kabul for August), and Lizzie wanted a secure place to sleep. 2. Buying another vehicle would have cost far more, even if it were an ancient VW Microbus.

I researched teardrop trailers online, and found out two important things. First: teardrop trailers emerged during the Depression, as families could not afford to stay in hotels. So our choice to build a teardrop is historically consistent. Second: it is very difficult to get plans of a teardrop trailer (for free). However, these trailers emerged at about the time that plywood became available, and for many D.I.Y. families, the 4′ x 8′ module of the plywood sheet was the standard-unit basis for the design. Here is my version:


Initially my design had a simple sloped back like other teardrops, the shape that gives them their name. Then I decided to add a swallow-tail to the galley hatch to separate laminar airflow over the trailer from backdraft turbulence behind it. Most recent cars have some version of this lip, so my hunch is that this will work better. Sophia looked at the new design-shape and said it looked like a guppy. And so this design was named!

But what would the Guppy sit on? I was not familiar with trailers, but our neighbors are. We took a look at a flatbed trailer parked nearby, made by Carson. From the manufacturer’s labeling on the trailer I realized that the flatbed has a VIN, and is engineered to comply with DOT standards. Essentially, the steel flatbed trailer is the vehicle, and the Guppy is merely the cargo, or payload that sits on the trailer. So I ordered a ‘flatbed mini’ from Carson, with a 4′ x 8′ frame, and an axle assembly rated at 2000 lbs. For this trip to work, the Guppy must weigh far less that 2000 lbs; maybe 300 lbs max. Part of the reason to design and build my own is to make it as light as possible.

And how would we tow this trailer with a Golf? We had to order a trailer hitch. Fortunately JC Whitney sells Curt trailer-hitch frames that fit a 1998 Golf, at $225. Installation was a pain, because the Golf is a unibody construction so there is no chassis nor any pre-made attachment points. I had to bore out 3/8″ bold-holes on some very irregular, compound-curve surfaces to mount the hitch frame.